最近,我不得不更改一些嵌套子目录中一堆配置文件中显示的文本。 我没有时间利用已有10年历史的perl技能,我在寻找一些可以使用的shell命令。 令人惊讶的是,网络上有很多例子都行不通,所以我得到了这些变体:
随意先进行测试,然后研究它们的工作原理。 在这两种情况下,我们都使用xargs生成sed命令向linux“ sed”命令提供了所需文件的列表(有关xargs的有趣摘要,请参见本文 )。
1.搜索并替换所有文件
如果您需要替换一组文件中的一组特定文本,但又不知道哪些文件可能包含您要查找的文本,这可能会很有用:
grep -lr -e 'old text' * | xargs sed -i 's/old text/new text/g'
在这里使用grep,我们以递归方式(“ -r”选项)查找包含文本“ old text”的文件。 您可以在这里真正地使用regex发挥创意,这可以通过“ -e”选项实现。
Grep提供了执行实际搜索和替换的文件列表(“ -l”选项)(您可以单独运行该部分以查看其输出); 然后,将此文件列表通过管道传递给set命令,然后该命令执行搜索和用新文本替换旧文本的实际工作。
sed的“ -i”选项将导致就地编辑,这意味着原始文件已被修改(在我的情况下,这是必要的,但是如果您提供-i,则可以告知sed进行备份)。 “ s /…”中的“ s”表示“替代”,“ g”表示“全局替换” –正是这样。
2.搜索并替换指定的文件
如果您碰巧知道需要更新的文件名,则可以使用以下变体:
find -name myconfig_file.txt | xargs sed -i 's/old text/new text/g'
这基本上是相同的想法,但是使用find操作来提供与给定名称匹配的文件列表。 从当前开始,这贯穿所有子目录。 然后,以与上述相同的方式将文件列表通过管道传输到sed。
PS Above命令在Ubuntu和RedHat上进行了测试
参考文献
翻译自: https://mkyong.com/linux/linux-search-and-replace-example/