例如
“textToSearchFor”=“theReplacementText”
(字典的格式不重要,可根据需要进行更改.)
我需要遍历给定目录的内容,包括子目录.对于扩展名为“.txt”的每个文件,我们搜索changesDictionary.txt中的每个键,用替换字符串值替换每个找到的实例.
即搜索和替换多个文件,但使用搜索/替换术语列表而不是单个搜索/替换术语.
我怎么能这样做? (我研究了单个搜索/替换示例,但不了解如何在文件中进行多次搜索.)
只要我可以在Mac OS X中从命令行运行它,实现(bash,perl,无论如何)并不重要.感谢您的帮助.
$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”来改变.
也许你已经考虑了这两个,但我提到因为我已经尝试过你以前做过的事情并没有想到它.我不知道有什么事情可以立即进行多次搜索和替换.所以,你需要对它进行编程以便自己做正确的事情.