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

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

以上是关于递归查找和替换文件中的字符串,为受影响的文件创建备份的主要内容,如果未能解决你的问题,请参考以下文章

如何在目录树中递归查找和替换所有出现的字符串? [复制]

在目录中递归查找和替换文件名

批量替换多个文件里边的字符串

Java实验项目三——递归实现字符串查找和替换操作

查找和替换文件中的单词/行

linux递归替换文件中的字符串