在 linux shell 中,以下命令将递归搜索并用 ‘that’ 替换所有 ‘this’ 实例(我面前没有 Linux shell,但它应该可以)。
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
OSX 上的类似命令会是什么样子?
原文由 Jack 发布,翻译遵循 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 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
3 回答3.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
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 {} +