在linux shell中,下面的命令将递归搜索"this"的所有实例,并将其替换为"that"(我前面没有linux shell,但它应该有).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
OSX上的类似命令会是什么样子?
在linux shell中,下面的命令将递归搜索"this"的所有实例,并将其替换为"that"(我前面没有linux shell,但它应该有).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
OSX上的类似命令会是什么样子?
OS X混合使用BSD和GNU工具,所以最好总是查看文档(尽管我听说less
甚至不符合OS X手册):
sed将-i
后面的参数作为备份的扩展.为无备份提供空字符串(-i ''
).
以下应该做:
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
-type f
只是一种良好的实践;如果你给它一个目录,sed会抱怨的.
-exec
优先于xargs
;你不必为-print0
或任何事而烦恼.
最后的{} +
表示find
将把所有结果作为参数附加到被调用命令的一个实例中,而不是 for each 结果重新运行它.(一个例外是操作系统允许的最大命令行参数数被 destruct ;在这种情况下,find
将运行多个实例.)
如果出现"无效字节序列"之类的错误,可以通过在命令开头添加LC_ALL=C
来强制使用标准语言环境,如下所示:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +