递归查找和替换文件中的字符串,为受影响的文件创建备份



我想在几个文件中查找字符串"foo"并替换为"bra",遍历目录(Linux机器)。如果在文件"example.txt"中替换了一个字符串,我需要在字符串替换之前将该文件复制到"example.text.old"。

我可以像这样递归替换字符串是文件:

find . -type f -name '*' -exec sed -i  's/test1/test2/g' {} + 

它工作正常,但是当某些东西不起作用时没有备份。

或者,我

偶然发现了这个可以工作的perl脚本,尽管我使用本机unix命令更舒服。

# perl -e "s/old_string/new_string/g;" -pi.save $(find DirectoryName -type f)

但是,这会备份所有文件,这不是我想要的。

replace.sh 制作了这个 bash 脚本,以便以后重用

#!/bin/bash
old=$1
new=$2
grep -r -l "$old" --exclude='*.{sh,old}' * | while read -r line ; do
  cp "$line" "$line.old"
  echo "Replacing '$old' with '$new' in file '$line'"
  sed -i "s/$old/$new/g" "$
done

使其可执行

$chmod +x replace.sh

注意:如果使用 Cygwin for Windows,您可能需要使用 dos2unix: dos2unix replace.sh

然后用两个字符串作为参数运行它,要查找的字符串和将替换的字符串是

./replace.sh foo bar

这将备份 (.old) 所有文件(不包括 .旧的.sh)包含单词"foo",然后用"bar"替换它

任何有用的提示将不胜感激!

最新更新