将文件中的多个字符串替换为多个文件

Substitute multiple strings from a file over multiple files

假设我是乔治·奥威尔,我想将一堆文件中的所有“大”实例替换为“小”、“富”替换为“差”、“聪明”替换为“愚蠢”等.所以我创建了一个文本文件,每次替换一行:

文件:substs.csv

big, small
rich, poor
smart, stupid

现在我想将 substs.csv 中的这些替换全局应用到一堆文件中。我假设这将使用 sed 脚本。请注意,我很乐意将 substs.csv 格式化为任何格式,只要每行有一个替换对即可。

什么是正确的工具,执行此操作的脚本是什么?

编辑 1:一次只对一个文件进行操作是可以的。我可以做 foreach 或等效的...

编辑 2:我可以保证右侧的替换不会出现在左侧,即操作顺序无关紧要。

[我很想跳出来 python 并在那里做。但这是刷新我的 unix 工具印章的机会...]

正如卡米尔在评论中所说,抚摸那只猫可能有上百万种不同的方式...

跳进我扭曲的脑海的是:

find -type f -name "*txt" -exec $(awk -F", *" 'BEGIN{printf "sed -i.bk "}{printf "-e s/%s/%s/g ", ,}END{printf "\n"}' substs.csv) {} \;

基本上我正在动态构建 sed 命令(使用您的 substs.csv 和 awk),然后通过查找使用它来修改任何以 .txt 结尾的文件。您的选择标准可能更宽泛,您可能 想要备份文件(去掉 "sed -i.bk " 中的 .bk)...但它会满足您的要求正在努力实现。

这可能适合您 (GNU sed):

sed -En 's#(\S+), (\S+)#s/\<\>//gp#' csvFile | sed -f - txtFile

将csv文件转换为sed文件,并应用于文本文件。

N.B。制造的正则表达式中的 start/end 个单词边界。