首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >首先使用sed替换文件中的字符串

首先使用sed替换文件中的字符串
EN

Stack Overflow用户
提问于 2011-04-21 17:35:04
回答 5查看 964关注 0票数 5

我想知道如何替换整个file.For示例中第一个搜索到的模式,

代码语言:javascript
代码运行次数:0
运行
复制
import java.io.File;
import java.io.File;

应替换为

代码语言:javascript
代码运行次数:0
运行
复制
import java.io.IOException;
import java.io.File;

我如何使用sed来实现这一点?谢谢

EN

回答 5

Stack Overflow用户

发布于 2011-04-22 13:34:48

当然,如果只需要替换就可以在一行中完成所有工作,那么就没有必要编写一些大而长的脚本。你只需要为这项工作选择合适的电动工具。

下面是Perl的一行代码:

代码语言:javascript
代码运行次数:0
运行
复制
% cat -n /tmp/f
     1  import java.lang.Character;
     2  import java.io.File;
     3  import java.io.File;
     4  import java.util.Pattern;

% perl -pe 's//IoException/ if m?import java\.io\.\KFile?' /tmp/f
import java.lang.Character;
import java.io.IoException;
import java.io.File;
import java.util.Pattern;

如果您想编辑文件,只需添加-i.bak即可

代码语言:javascript
代码运行次数:0
运行
复制
% perl -i.bak -pe 's//IoException/ if m?import java\.io\.\KFile?' /tmp/f

% head /tmp/f{,.bak}
==> /tmp/f <==
import java.lang.Character;
import java.io.IoException;
import java.io.File;
import java.util.Pattern;

==> /tmp/f.bak <==
import java.lang.Character;
import java.io.File;
import java.io.File;
import java.util.Pattern;

这样做的原因是,当您为m//操作符提供??分隔符时,它需要记住一些内置状态,以便仅在第一次匹配时才进行匹配。

然后,在替换中,空模式意味着重用最后一个匹配的模式,因此您不必再次键入它,从而冒着两个模式永远不同的风险。

最后,模式中的\K在比赛中食言,把东西“留”在左边,这样它就不会被替补吃掉。

票数 2
EN

Stack Overflow用户

发布于 2011-05-27 21:17:52

代码语言:javascript
代码运行次数:0
运行
复制
cat file | sed -e ':l
    0,/my_search_str/ {
    /my_search_str/! {
            N;
            b l
            }
    s/my_search_str/replace_this/g  
    :t
    N
    b t     
    }
    '

这对我很有效: file:(之前)

代码语言:javascript
代码运行次数:0
运行
复制
hello1
my_search_str
hello2
mysearch_str
hello3

文件:(之后)

代码语言:javascript
代码运行次数:0
运行
复制
hello1
replace_this
hello2
mysearch_str
hello3
票数 2
EN

Stack Overflow用户

发布于 2011-05-27 22:14:46

我要做的是将所有行都添加到一个很棒的行中,并替换内容。

代码语言:javascript
代码运行次数:0
运行
复制
$ cat f
import java.io.File;
import java.io.File;
$ sed -n 'N
  ${
    s/import java.io.File;/import java.io.IOException/
    p
  }' f
import java.io.IOException
import java.io.File;

工作原理:首先,我禁止行打印,这是默认行为,将-n选项传递给sed。

然后就是赛义德司令官。第一个是N命令:它将一个换行符和流的下一行附加到当前行,然后在模式空间中进行维护。这会将当前行更改为下一行,然后将追加下一行...直到文件的末尾。

在文件的末尾以及在最后一行执行的N命令之后,模式空间将包含所有行。然后,在文件末尾(由$地址指定),我们只需将所需的行替换为:

代码语言:javascript
代码运行次数:0
运行
复制
s/import java.io.File;/import java.io.IOException/

由于默认情况下,s///命令在模式空间中每次迭代只进行一次替换,因此它将只替换第一行。现在,模式空间替换了行,但由于我们使用了-n选项,因此不会打印出来。因此,我们需要使用p命令打印它。一旦我们将在文件末尾执行两个操作,我们使用$对其进行寻址,并将操作放在括号({})之间。

在这里,为了清楚起见,我们只在多行中给出了sed命令。我们可以在一行中使用它们;只需用分号分隔它们:

代码语言:javascript
代码运行次数:0
运行
复制
$ sed -n 'N;${s/import java.io.File;/import java.io.IOException/;p;}' f
import java.io.IOException
import java.io.File;

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5742206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档