有没有一种简单的方法可以使用sed
来替换与目录模式匹配的文件中的文本?例如,如果我有一个名为 somedir/example.txt
的文件,其中包含以下文本:
福巴
我可以运行以下内容:
sed -i -e 's/foo/bar/g' somedir/example.txt
导致文件的文本为:
巴巴
有没有办法指定目录模式,例如:
somedir/**/example.txt
哪个会递归更新somedir
文件夹下的任何example.txt
文件?如果有更简单的方法可以做到这一点,我也是游戏。
如果您有 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
如果设置,则路径名扩展上下文中使用的模式 ** 将匹配所有文件和零个或多个目录 和子目录。 如果模式后跟/,则仅 目录和子目录匹配。
我将接受 John 的回答,但是由于我想出了使用 perl 的方法,当他写他的答案时,我想我还是会发布:
find somedir -type f -name 'example.txt' -print0 | xargs -0 perl -i -pe 's/foo/bar/g'