微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

unix – Shell脚本 – 使用字符串列表搜索和替换多个文件中的文本

我有一个文件“changesDictionary.txt”包含(可变数量)键值字符串对.

例如

“textToSearchFor”=“theReplacementText”

(字典的格式不重要,可根据需要进行更改.)

我需要遍历给定目录的内容,包括子目录.对于扩展名为“.txt”的每个文件,我们搜索changesDictionary.txt中的每个键,用替换字符串值替换每个找到的实例.

搜索和替换多个文件,但使用搜索/替换术语列表而不是单个搜索/替换术语.

我怎么能这样做? (我研究了单个搜索/替换示例,但不了解如何在文件中进行多次搜索.)

只要我可以在Mac OS X中从命令行运行它,实现(bash,perl,无论如何)并不重要.感谢您的帮助.

我将您的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

请注意,sed的-i选项可以“就地”编辑文件,因此请务必进行安全备份,或使用-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”变成“固定”还是“破碎”?订单对sed脚本很重要.类似地,搜索和替换可以被搜索和替换不止一次 – 将“a”改为“b”,可以通过稍后的搜索和替换从“b”到“c”来改变.

也许你已经考虑了这两个,但我提到因为我已经尝试过你以前做过的事情并没有想到它.我不知道有什么事情可以立即进行多次搜索和替换.所以,你需要对它进行编程以便自己做正确的事情.

原文地址:https://www.jb51.cc/bash/387116.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐