是否有一种简单的方法可以使用sed
替换与目录模式匹配的文件中的文本?例如,如果我有一个名为somedir/example.txt
的文件,其中包含以下文本:
foobar的
我可以运行以下内容:
sed -i -e 's/foo/bar/g' somedir/example.txt
导致文件的文本为:
BARBAR
有没有办法指定目录模式,如:
somedir/**/example.txt
哪会以递归方式更新example.txt
文件夹下的任何somedir
文件?如果有更简单的方法来实现这一点,我也是游戏。
答案 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'