将文件中的多个字符串替换为多个文件
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 个单词边界。
假设我是乔治·奥威尔,我想将一堆文件中的所有“大”实例替换为“小”、“富”替换为“差”、“聪明”替换为“愚蠢”等.所以我创建了一个文本文件,每次替换一行:
文件: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 个单词边界。