Linux命令行全局搜索和替换?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (512)

我想在Linux机器上grep搜索和替换匹配的字符串。

grep -n 'foo' *将以下列形式提供输出:

[filename]:[line number]:[text]

有没有一个很好的方法来做到这一点?

提问于
用户回答回答于

你的意思是搜索并替换所有grep匹配的文件中的字符串?

perl -p -i -e 's/old/new/g' `ack -l searchpattern`

要处理文件名中的空白,可以运行:

ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'

你可以做更多的事情ack-grep。假设您只想将搜索限制在HTML文件中:

ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'

如果空白不是一个问题,它甚至更短:

perl -p -i -e 's/old/new/g' `ack -l --html searchpattern`
perl -p -i -e 's/old/new/g' `ack -f --html` # will match all html files
用户回答回答于

例子:

sed -i 's/foo/bar/g' *

它不是递归的,替换整个树中选定的文件,我会使用find:

find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;

*.html是文件必须匹配的表达式,.bak-i创建原始文件的副本之后,扩展名为.bak(可以是任何扩展名),gsed表达式的结尾告诉sed将多个副本替换为一行(而不只是第一行)。该-print发现是一个方便,显示了正在匹配的文件。所有这些都取决于系统上这些工具的版本。

扫码关注云+社区

领取腾讯云代金券