Mac 和 Linux 上的文本文件中的递归搜索和替换

新手上路,请多包涵

在 linux shell 中,以下命令将递归搜索并用 ‘that’ 替换所有 ‘this’ 实例(我面前没有 Linux shell,但它应该可以)。

 find . -name "*.txt" -print | xargs sed -i 's/this/that/g'

OSX 上的类似命令会是什么样子?

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

阅读 528
2 个回答

OS X 混合使用 BSD 和 GNU 工具,因此最好始终检查文档(尽管我认为 less 甚至不符合 OS X 手册页):

https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html

sed 将 -i 之后的参数作为备份的扩展名。为无备份提供一个空字符串 ( -i '' )。

以下应该做:

find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +

-type f 只是很好的做法;如果你给它一个目录左右,sed 会抱怨。

-exec 优于 xargs ;你不必为 -print0 或任何东西而烦恼。

最后的 {} + 意味着 find 会将所有结果作为参数附加到被调用命令的一个实例,而不是为每个结果重新运行它。 (一个例外是操作系统允许的最大命令行参数数量被破坏;在这种情况下, find 将运行多个实例。)

如果您收到“无效字节序列”之类的错误,则可以通过在命令开头添加 LC_ALL=C 来强制使用标准语言环境,如下所示:

LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +

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

对于 mac,更类似的方法是:

 find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"

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

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