针对与目录模式匹配的文件的递归Sed

时间:2016-06-01 21:37:08

标签: bash shell sed sh

是否有一种简单的方法可以使用sed替换与目录模式匹配的文件中的文本?例如,如果我有一个名为somedir/example.txt的文件,其中包含以下文本:

  

foobar的

我可以运行以下内容:

sed -i -e 's/foo/bar/g' somedir/example.txt

导致文件的文本为:

  

BARBAR

有没有办法指定目录模式,如:

somedir/**/example.txt

哪会以递归方式更新example.txt文件夹下的任何somedir文件?如果有更简单的方法来实现这一点,我也是游戏。

2 个答案:

答案 0 :(得分:1)

如果你有bash版本4,请运行

shopt -s globstar
sed -i -e 's/foo/bar/g' somedir/**/example.txt

如果你有早期版本的bash或只是一个POSIX shell,那么运行:

find somedir -type f -name 'example.txt' -exec sed -i -e 's/foo/bar/g' {} +

对于OSX:

find somedir -type f -name 'example.txt' -exec sed -i '' -e 's/foo/bar/g' {} +

文档

来自man bash(版本4 +):

  

globstar
如果设置,路径名扩展上下文中使用的模式**将匹配所有文件和零个或多个目录   和子目录。如果模式后跟一个/,则仅   目录和子目录匹配。

答案 1 :(得分:1)

我会接受John的回答,但是因为我想出了一种方法来处理perl,而他正在写他的答案,我想我还是会发帖:

find somedir -type f -name 'example.txt' -print0 | xargs -0 perl -i -pe 's/foo/bar/g'