在Mac和Linux上的文本文件中进行递归搜索和替换

Jac*_*ack 117 linux macos shell

在linux shell中,以下命令将递归搜索并将'this'的所有实例替换为'that'(我在我面前没有Linux shell,但它应该这样做).

find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
Run Code Online (Sandbox Code Playgroud)

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

Tay*_*nUB 232

OS X使用混合的BSD和GNU工具,所以最好总是查看文档(虽然我有它less甚至不符合OS X手册页):

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html

sed将参数-i作为备份的扩展名.提供空字符串(-i '')以进行无备份.

以下应该做:

LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +

-type f只是一种很好的做法; 如果你给它一个目录左右,sed会抱怨. -exec优先于xargs; 你不必费心-print0或任何事情.将{} +在年底意味着find将所有结果作为参数添加的,而不是给被叫命令的一个实例,再运行它为每个结果.(一个例外是当操作系统允许的最大命令行参数数量被破坏时;在这种情况下find将运行多个实例.)

  • 其他人得到"非法字节序列"错误?若然,请尝试:`LC_ALL = C find.-type f -name'*.txt'-exec sed -i''s/this/that/{} +`,它对我有用. (15认同)
  • 这将替换每个文件只有一个ocurreny,使用`/ g`表示多个货币,如`LC_ALL = C find.-type f -exec sed -i's/search/replace/g {} +` (6认同)
  • Sed语法允许使用几乎*any*字符代替斜杠,例如你可以使用`%`字符:`sed's%localhost/site%blah/blah%"`.另一种方法是反斜杠 - 转义分隔符:`sed"s/localhost\/ site/blah\/ blah /"`. (4认同)
  • 像魅力一样工作,谢谢,欢迎来到stackoverflow ;-) (2认同)
  • 这个替换中的"this"包含正斜杠(localhost/site) - 我在.html文件中替换了URL的一部分....我如何进行这样的替换.我尝试使用双引号,但它失败了. (2认同)

Wil*_*ill 130

对于mac,更类似的方法是这样的:

find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
Run Code Online (Sandbox Code Playgroud)

  • 我希望每次回到它并使用它时我都可以投票.它现在是+15,很容易. (5认同)
  • 对我来说,这应该是正确的答案。这是唯一对我有用的。 (2认同)

Men*_*tor 14

如果您使用的是 zsh 终端,您可以使用通配符魔法:

sed -i "" "s/search/high-replace/g" *.txt

  • 由于 OSX 现在默认具有 ZSH 终端,因此这应该是可接受的答案。 (2认同)

mad*_*adx 12

在Mac OSX 10.11.5上,这很好用:

grep -rli 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
Run Code Online (Sandbox Code Playgroud)


Mac*_*ban 11

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

grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
Run Code Online (Sandbox Code Playgroud)

归功于:Todd Cesere的回答

  • 这个效果很好!在某些情况下,其他脚本会在 OSX 上添加额外的行尾!多谢! (3认同)

eb8*_*b80 10

以上都不适用于OSX.

请执行下列操作:

perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
Run Code Online (Sandbox Code Playgroud)


小智 6

适用于Linux和Mac OS X的版本(通过添加-e开关sed):

export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
Run Code Online (Sandbox Code Playgroud)

  • sed:RE错误:非法字节序列 (5认同)
  • 要解决“非法字节序列”错误,请在运行命令之前尝试设置 LOCALE:`export LC_CTYPE=C && export LANG=C` (2认同)

小智 6

这是我的可行的。在 Mac OS X 10.10.4 上

grep -e 'this' -rl . | xargs sed -i '' 's/this/that/g'
Run Code Online (Sandbox Code Playgroud)

上面的使用find会更改不包含搜索文本的文件(在文件末尾添加新行),这是冗长的。


Xys*_*Xys 6

2021年

什么对我有用:

LC_ALL=C && LANG=C && find . -type f | xargs sed -i '' 's/old/new/g'
Run Code Online (Sandbox Code Playgroud)