递归查找和替换文件中的字符串,为受影响的文件创建备份
Posted
技术标签:
【中文标题】递归查找和替换文件中的字符串,为受影响的文件创建备份【英文标题】:Find and replace string in files recursively, create backup for affected files 【发布时间】:2016-11-18 10:53:18 【问题描述】:我想在几个文件中查找字符串“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)
但是,这会备份 ALL 文件,这不是我想要的。
【问题讨论】:
【参考方案1】:我制作了这个 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
这会备份 (.old) 包含单词 'foo' 的所有文件(不包括 .old 和 .sh),然后用'bar'替换它
任何有用的提示将不胜感激!
【讨论】:
需要注意的是,这个脚本是从它所在的目录和所有子目录运行的 有关 unix stackexchange 的类似问题:unix.stackexchange.com/a/295696/109046以上是关于递归查找和替换文件中的字符串,为受影响的文件创建备份的主要内容,如果未能解决你的问题,请参考以下文章