如何replace一堆文件中的多行string

#!/bin/sh old="hello" new="world" sed -is/"${old}"/"${new}"/g $(grep "${old}" -rl *) 

前面的脚本只适用于单行文本,我怎么写一个脚本可以replace多行文本。

 old='line1 line2 line3' new='newtext1 newtext2' 

我可以使用什么命令。

Solutions Collecting From Web of "如何replace一堆文件中的多行string"

你可以使用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,你可以先读取整个文件,但是对于内存使用情况来说,这又不好)

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 (可脚本化的解决方案)。

也看到这个和sed常见问题。