【问题标题】:Recursive Sed Against Files that Match a Directory Pattern针对匹配目录模式的文件递归 Sed
【发布时间】:2016-06-01 21:37:07
【问题描述】:

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

foobar

我可以运行以下命令:

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

导致文件的文本为:

栏杆

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

somedir/**/example.txt

哪个会递归更新somedir 文件夹下的任何example.txt 文件?如果有更简单的方法可以做到这一点,我也是。

【问题讨论】:

标签: bash shell sed sh


【解决方案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
如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件和零个或多个目录 和子目录。如果模式后跟 /,则只有 目录和子目录匹配。

【讨论】:

  • 顺便说一句,它不能是 OSX,因为它的 sed 版本需要一个明确的空字符串,例如sed -i '' -e.
【解决方案2】:

我会接受 John 的回答,但是因为我想出了一种使用 perl 的方法,当他写他的答案时,我想我还是会发布:

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

【讨论】:

  • 非常好。或者:find somedir -type f -name 'example.txt' -exec perl -i -pe 's/foo/bar/g' {} +
  • 您使用perl 还是sed 完全无关紧要。您的问题只是关于如何递归地查找所有文件,然后您对它们的处理是正交的。所以这和约翰的回答基本一样。
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2010-10-06
  • 2013-09-06
  • 2022-01-12
  • 2014-06-17
  • 2021-09-17
  • 2015-09-12
相关资源
最近更新 更多