在 linux shell 中,以下命令将递归搜索并用 'that' 替换所有 'this' 实例(我面前没有 Linux shell,但应该可以)。
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
在 OSX 上类似的命令会是什么样子?
最佳答案
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 ''
) 表示不进行备份。
以下应该做:
找到 . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
-type f
只是一个好习惯;如果你给它一个目录左右,sed 会提示。
-exec
优于 xargs
;您不必为 -print0
或任何东西而烦恼。
末尾的 {} +
意味着 find
会将所有结果作为参数附加到被调用命令的一个实例,而不是为每个结果重新运行它. (一个异常(exception)是操作系统允许的最大命令行参数数量被破坏;在这种情况下,find
将运行多个实例。)
如果您收到“无效字节序列”之类的错误,则可以通过在命令开头添加 LC_ALL=C
来强制使用标准语言环境,如下所示:
LC_ALL=C 查找 . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
https://stackoverflow.com/questions/9704020/