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

时间:2016-07-15 09:26:54

标签: bash unix replace cygwin backup

我想在几个文件中找到并用“bra”替换字符串“foo”,遍历目录(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)

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

1 个答案:

答案 0 :(得分:0)

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

#!/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

这使得包含单词'foo'的所有文件( .sh 除外)的备份( .old ),然后用'bar'替换它

非常感谢任何有用的提示!