我想知道如何替换整个file.For示例中第一个搜索到的模式,
import java.io.File;
import java.io.File;
应替换为
import java.io.IOException;
import java.io.File;
我如何使用sed来实现这一点?谢谢
发布于 2011-04-22 05:34:48
当然,如果只需要替换就可以在一行中完成所有工作,那么就没有必要编写一些大而长的脚本。你只需要为这项工作选择合适的电动工具。
下面是Perl的一行代码:
% 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即可
% 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
在比赛中食言,把东西“留”在左边,这样它就不会被替补吃掉。
发布于 2011-05-27 13:17:52
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:(之前)
hello1
my_search_str
hello2
mysearch_str
hello3
文件:(之后)
hello1
replace_this
hello2
mysearch_str
hello3
发布于 2011-05-27 14:14:46
我要做的是将所有行都添加到一个很棒的行中,并替换内容。
$ 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
命令之后,模式空间将包含所有行。然后,在文件末尾(由$
地址指定),我们只需将所需的行替换为:
s/import java.io.File;/import java.io.IOException/
由于默认情况下,s///
命令在模式空间中每次迭代只进行一次替换,因此它将只替换第一行。现在,模式空间替换了行,但由于我们使用了-n
选项,因此不会打印出来。因此,我们需要使用p
命令打印它。一旦我们将在文件末尾执行两个操作,我们使用$
对其进行寻址,并将操作放在括号({}
)之间。
在这里,为了清楚起见,我们只在多行中给出了sed命令。我们可以在一行中使用它们;只需用分号分隔它们:
$ sed -n 'N;${s/import java.io.File;/import java.io.IOException/;p;}' f
import java.io.IOException
import java.io.File;
HTH
https://stackoverflow.com/questions/5742206
复制