我正在尝试搜索并替换所有与grep匹配的文件中的字符串:
grep -n 'foo' *
将以下面的形式给出输出:
[filename]:[line number]:[text]
对于grep返回的每个文件,我希望通过用bar
替换foo
来修改该文件。
发布于 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
可以方便地显示正在匹配的文件。所有这一切都取决于系统上这些工具的确切版本。
发布于 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/' *
发布于 2010-07-21 02:14:03
我喜欢并使用了上面的解决方案,或者在数千个文件中进行系统范围的搜索和替换:
find -name '*.htm?' -print -exec sed -i.bak 's/foo/bar/g' {} \;
我假设是“*.htm?”它搜索并查找类似的.htm和.html文件,而不是.html。
我将.bak替换为系统范围更广的波浪号(~),以便更轻松地清理备份文件。
https://stackoverflow.com/questions/471183
复制相似问题