Linux 如何替换一堆文件中的多行字符串

Linux 如何替换一堆文件中的多行字符串,linux,bash,Linux,Bash,前面的脚本只适用于单行文本,如何编写可以替换的脚本 多行文本 #!/bin/sh old="hello" new="world" sed -i s/"${old}"/"${new}"/g $(grep "${old}" -rl *) 我可以使用什么命令。awk可以为您这样做 old='line1 line2 line3' new='newtext1 newtext2' 但是您可以使用vim(可编写脚本的解决方案)来完成 另请参见sed常见问题解答中的和。您可以使用perl或awk,并将记录

前面的脚本只适用于单行文本,如何编写可以替换的脚本 多行文本

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

我可以使用什么命令。

awk
可以为您这样做

old='line1
line2
line3'

new='newtext1
newtext2'
但是您可以使用
vim
(可编写脚本的解决方案)来完成


另请参见sed常见问题解答中的和。

您可以使用perl或awk,并将记录分隔符更改为除换行符以外的其他内容(这样您就可以匹配较大的块。例如,使用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
或者使用perl(-00==段落缓冲模式)

我不知道是否有可能根本没有记录分隔符(使用perl,您可以先读取整个文件,但在内存使用方面这又不好)

可能的重复
echo -e "one\ntwo\nthree" | awk 'BEGIN{RS="\n\n"} sub(/two\nthree\n, "foo")'
echo -e "one\ntwo\nthree" | perl -00 -pne 's/two\nthree/foo/'