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

标签 linux bash sh

我正在使用下面的代码,但似乎无法让 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

最佳答案

下面是使用 bash 和 Perl 的方法:

shopt -s globstar nullglob
cd $searchdirectory
perl -0777 -i.bak -pe "s/$searchterm/$replaceterm/g" **

perl 的-0777 选项读取整个文件,而不是逐行读取。然后模式匹配可以一次处理整个文件。我假设你的文件不是很大。 我还假设您没有任何带空格或换行符的文件名。

请注意,这将触及每个 文件。之后您可以清除目录以从 file 中删除任何未更改的 file.bak

关于linux - 在许多文件中用多行替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20406243/

相关文章:

linux - 什么时候CPSR GE[3 :0] bits be modified

linux - 在 Linux 控制台上将键码转换为键符号的库

bash - 如果当前没有运行,我如何只运行 ffmpeg

linux - 将程序的输出日志传递给函数,同时将返回码存储在变量中

java - 为什么这个Java程序会导致内存泄漏?

php - 通过 PHP 执行 SSH

linux - Bash 脚本编写和比较 2 个目录 - 初学者

bash - 使用 COM 端口读取/写入数据的批处理脚本

linux - 管道中的 while 循环对 Solaris/bin/sh 但对 Linux 没有副作用

shell - shell heredocs 中的 <EOF 和 <'EOF' 有什么区别?