2012-02-10 22 views
2
#!/bin/sh 
old="hello" 
new="world" 
sed -i s/"${old}"/"${new}"/g $(grep "${old}" -rl *) 

上面的脚本只是单行文本工作,我怎么可以编写一个脚本可以代替 多行文本的多行字符串。如何更换在一堆文件

old='line1 
line2 
line3' 

new='newtext1 
newtext2' 

我可以使用什么命令。

+0

[sed和awk:如何将一段文件替换为另一个内容的可能的重复?](http://stackoverflow.com/questions/4311915/sed-and-awk-how-to-replace-a-section-的文件到另一个内容) – parvus 2013-10-17 05:38:44

回答

1

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 

但是你可以用vimlike described here(编写脚本的解决方案)做到这一点。

另请参阅sed faq中的thisthis

1

你可以用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,你可以先阅读整个文件,但话又说回来,这不是很好至于内存使用)

相关问题