更改文件夹中的所有匹配项

新手上路,请多包涵

我需要对文件夹(及其子文件夹)中的所有文件进行正则表达式查找和替换。执行此操作的 linux shell 命令是什么?

例如,我想在所有文件上运行它,并用新的替换文本覆盖旧文件。

 sed 's/old text/new text/g'

原文由 nickf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 394
2 个回答

仅使用 sed 是无法做到的。您至少需要一起使用 find 实用程序:

 find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;

此命令将为每个更改的文件创建一个 .bak 文件。

笔记:

  • -i sed 命令的参数是 GNU 扩展,因此,如果您使用 BSD 的 sed 运行此命令,则需要将输出重定向到新文件然后重命名它。
  • find 实用程序没有在旧的 UNIX 机器中实现 -exec 参数,因此,您需要使用 | xargs 代替。

原文由 osantana 发布,翻译遵循 CC BY-SA 2.5 许可协议

我更喜欢使用 find | xargs cmd 而不是 find -exec 因为它更容易记住。

此示例在当前目录或当前目录下的 .txt 文件中将“foo”全局替换为“bar”:

 find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g"

如果您的文件名不包含空格等时髦字符,则可以省略 -print0-0 选项。

原文由 Dennis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题