#!/bin/sh
old="hello"
new="world"
sed -i s/"${old}"/"${new}"/g $(grep "${old}" -rl *)
上面的脚本只是单行文本工作,我怎么可以编写一个脚本可以代替 多行文本的多行字符串。如何更换在一堆文件
old='line1
line2
line3'
new='newtext1
newtext2'
我可以使用什么命令。
#!/bin/sh
old="hello"
new="world"
sed -i s/"${old}"/"${new}"/g $(grep "${old}" -rl *)
上面的脚本只是单行文本工作,我怎么可以编写一个脚本可以代替 多行文本的多行字符串。如何更换在一堆文件
old='line1
line2
line3'
new='newtext1
newtext2'
我可以使用什么命令。
awk
可以为你做到这一点。
awk 'BEGIN { RS="" }
FILENAME==ARGV[1] { s=$0 }
FILENAME==ARGV[2] { r=$0 }
FILENAME==ARGV[3] { sub(s,r) ; print }
' FILE_WITH_CONTENTS_OF_OLD FILE_WITH_CONTENTS_OF_NEW ORIGINALFILE > NEWFILE
但是你可以用vim
like described here(编写脚本的解决方案)做到这一点。
你可以用perl或awk和更改记录分隔符的东西比其他换行符(这样你就可以对阵更大的块例如使用awk:
echo -e "one\ntwo\nthree" | awk 'BEGIN{RS="\n\n"} sub(/two\nthree\n, "foo")'
或用Perl(-00 ==段缓冲模式)
echo -e "one\ntwo\nthree" | perl -00 -pne 's/two\nthree/foo/'
我不知道是否有可能有根本没有记录分隔符(用Perl,你可以先阅读整个文件,但话又说回来,这不是很好至于内存使用)
[sed和awk:如何将一段文件替换为另一个内容的可能的重复?](http://stackoverflow.com/questions/4311915/sed-and-awk-how-to-replace-a-section-的文件到另一个内容) – parvus 2013-10-17 05:38:44