首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Mac和Linux上递归搜索和替换文本文件

在Mac和Linux上递归搜索和替换文本文件
EN

Stack Overflow用户
提问于 2012-03-14 22:36:21
回答 10查看 136.1K关注 0票数 143

在linux shell中,以下命令将递归地搜索“this”的所有实例,并将其替换为“that”(我面前没有Linux shell,但它应该有)。

代码语言:javascript
复制
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-03-15 03:57:21

OS混合使用了BSD和GNU工具,所以最好总是查看文档(尽管我知道less甚至不符合OS手册页):

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将会报错。

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 {} +

票数 268
EN

Stack Overflow用户

发布于 2013-06-26 06:36:25

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

代码语言:javascript
复制
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
票数 193
EN

Stack Overflow用户

发布于 2013-11-08 22:27:05

作为替代解决方案,我在Mac OSX 10.7.5上使用此解决方案

代码语言:javascript
复制
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @

归功于:Todd Cesere's answer

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9704020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档