在linux shell中,以下命令将递归地搜索“this”的所有实例,并将其替换为“that”(我面前没有Linux shell,但它应该有)。
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
在OSX上类似的命令会是什么样子?
发布于 2012-03-15 03:57:21
OS混合使用了BSD和GNU工具,所以最好总是查看文档(尽管我知道less
甚至不符合OS手册页):
sed将-i
之后的参数作为备份的扩展。为无备份提供空字符串(-i ''
)。
执行以下操作:
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
-type f
只是一个很好的实践;如果您给它一个或更多的目录,sed将会报错。
与xargs
相比,-exec
更可取;您不需要费心使用-print0
或其他任何东西。
末尾的{} +
意味着find
会将所有结果作为参数附加到被调用命令的一个实例中,而不是为每个结果重新运行它。(一个例外是当违反操作系统允许的命令行参数的最大数量时;在这种情况下,find
将运行多个实例。)
如果您收到类似"invalid byte sequence“的错误,通过在命令开头添加LC_ALL=C
来强制使用标准语言环境可能会有所帮助,如下所示:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
发布于 2013-06-26 06:36:25
对于mac,一种更类似的方法是:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
发布于 2013-11-08 22:27:05
作为替代解决方案,我在Mac OSX 10.7.5上使用此解决方案
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
https://stackoverflow.com/questions/9704020
复制相似问题