Linux 在许多文件中用多行替换字符串

Linux 在许多文件中用多行替换字符串,linux,bash,sh,Linux,Bash,Sh,我正在使用下面的代码,似乎无法使searchterm与多行字符串匹配 !/bin/bash # **************** Change Variables Here ************ startdirectory="/home/www" searchterm="<img src=\"index.gif\"> <p>Hello World</p> " replaceterm="Hi" # *****************************

我正在使用下面的代码,似乎无法使searchterm与多行字符串匹配

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/home/www"
searchterm="<img src=\"index.gif\">
<p>Hello World</p>
"
replaceterm="Hi"
# **********************************************************

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i
/bin/bash
#****************在此处更改变量************
startdirectory=“/home/www”
搜索项=”
你好,世界

" replaceterm=“你好” # ********************************************************** i=0; 对于$中的文件(grep-l-R$searchterm$startdirectory) 做 cp$file$file.bak sed-e“s/$searchterm/$replaceterm/ig”$file>tempfile.tmp mv tempfile.tmp$文件 让i++; echo“已修改:$file 完成 echo“***全部完成!***修改的文件:$i
下面是使用bash和Perl的方法:

shopt -s globstar nullglob
cd $searchdirectory
perl -0777 -i.bak -pe "s/$searchterm/$replaceterm/g" **
perl的
-0777
选项读取整个文件,而不是逐行读取。然后模式匹配可以同时在整个文件上工作。我想你的档案不是很大。 我还假设您没有任何带空格或换行符的文件名


请注意,这将触及每个文件。您可以随后扫描目录以删除任何
文件。bak
文件
中保持不变

sed
主要一次工作一行。在多行上搜索是可能的,但这项工作非常辛苦,您通常不会这样做。您需要迁移到更强大的语言—可能是Perl或Python。您可能可以在
awk
中完成它;它将比sed更简单,但比Perl或Python更难。