首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >命令行:在grep匹配的所有文件名中搜索和替换

命令行:在grep匹配的所有文件名中搜索和替换
EN

Stack Overflow用户
提问于 2009-01-23 06:54:16
回答 6查看 104.6K关注 0票数 81

我正在尝试搜索并替换所有与grep匹配的文件中的字符串:

grep -n 'foo' *将以下面的形式给出输出:

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

对于grep返回的每个文件,我希望通过用bar替换foo来修改该文件。

EN

回答 6

Stack Overflow用户

发布于 2009-01-23 01:41:57

根据您给出的示例,这似乎就是您想要的:

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

它不是递归的(它不会下降到子目录中)。对于一个很好的解决方案,在整个树中替换选定的文件,我会使用find:

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

*.html是文件必须匹配的表达式,-i之后的.bak创建原始文件的副本,扩展名为.bak (可以是您喜欢的任何扩展名),而sed表达式末尾的g告诉sed替换一行上的多个副本(而不仅仅是第一个)。要查找的-print可以方便地显示正在匹配的文件。所有这一切都取决于系统上这些工具的确切版本。

票数 108
EN

Stack Overflow用户

发布于 2009-01-22 22:59:28

如果您的sed(1)有一个-i选项,那么可以这样使用它:

for i in *; do
  sed -i 's/foo/bar/' $i
done

如果不是,根据您要使用的语言,有以下几种方式的变体:

ruby -i.bak -pe 'sub(%r{foo}, 'bar')' *
perl -pi.bak -e 's/foo/bar/' *
票数 14
EN

Stack Overflow用户

发布于 2010-07-21 02:14:03

我喜欢并使用了上面的解决方案,或者在数千个文件中进行系统范围的搜索和替换:

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

我假设是“*.htm?”它搜索并查找类似的.htm和.html文件,而不是.html。

我将.bak替换为系统范围更广的波浪号(~),以便更轻松地清理备份文件。

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

https://stackoverflow.com/questions/471183

复制
相关文章

相似问题

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