我会将您的 changesDictionary.txt 文件转换为 sed 脚本,使用... sed:
$ sed -e 's/^"\(.*\)" = "\(.*\)"$/s\/\1\/\2\/g/' \
changesDictionary.txt > changesDictionary.sed
请注意,字典中正则表达式或 sed 表达式的任何特殊字符都将被 sed 错误解释,因此您的字典要么只能具有最原始的搜索和替换,要么您需要维护 sed 文件有效的表达。不幸的是,在 sed 中没有简单的方法来关闭正则表达式并仅使用字符串匹配或将您的搜索和替换引用为“文字”。
使用生成的 sed 脚本,使用 find和xargs——而不是 find -exec——通过一次处理多个文件,尽快使用 sed 脚本转换文件。
$ find somedir -type f -print0 \
| xargs -0 sed -i -f changesDictionary.sed
请注意,-i
sed 选项“就地”编辑文件,因此请务必进行备份以确保安全,或用于-i~
创建波浪号备份。
最后一点,使用搜索和替换可能会产生意想不到的后果。您的搜索是否是其他搜索的子字符串?这是一个例子。
$ cat changesDictionary.txt
"fix" = "broken"
"fixThat" = "Fixed"
$ sed -e 's/^"\(.*\)" = "\(.*\)"$/s\/\1\/\2\/g/' changesDictionary.txt \
| tee changesDictionary.sed
s/fix/broken/g
s/fixThat/Fixed/g
$ mkdir subdir
$ echo fixThat > subdir/target.txt
$ find subdir -type f -name '*.txt' -print0 \
| xargs -0 sed -i -f changesDictionary.sed
$ cat subdir/target.txt
brokenThat
“fixThat”应该变成“Fixed”还是“brokenThat”?sed 脚本的顺序很重要。类似地,搜索和替换可以多次搜索和替换——将“a”更改为“b”,稍后可能会被另一个搜索和替换从“b”更改为“c”。
也许你已经考虑过这两个,但我提到是因为我已经尝试过你之前正在做的事情并且没有想到它。我不知道任何可以一次进行多次搜索和替换的正确方法。因此,您需要对其进行编程以自己做正确的事情。