【问题标题】:BASH: recursive program to replace text in a tree of filesBASH:用于替换文件树中文本的递归程序
【发布时间】:2012-01-03 07:23:32
【问题描述】:

我是 Bash 的新手,但我似乎无法找到一种方法让它做我想做的事。

假设您有一个包含 2 个文件的树目录: /top.php 和 /test/bottom.php

如何使我的函数看起来并在 /top.php 和 /test/bottom.php 中将 say "hello" 替换为 "bonjour"?

到目前为止,我发现这样做的唯一方法是使用不同的深度级别两次调用相同的函数:

find ./*.php -type f -exec sed -i 's/hello/bonjour/' {} \;
find ./*/*.php -type f -exec sed -i 's/hello/bonjour/' {} \;

肯定有一种递归方式可以在一行中执行此操作吗?

【问题讨论】:

标签: bash recursion replace


【解决方案1】:

使用实际模式进行查找而不是 shell 通配符扩展:

find . -name '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \;

【讨论】:

  • 你的工作完美!如果可以的话,我会支持它,但我还没有所需的声誉
  • @Erken:谢谢。您应该有接受答案的声誉(选票下方的复选标记)。无论如何,如果它有效,这是正确的响应:-)。
  • 完美,明白了!非常感谢你们,你们的速度真是太快了!! oO
  • 谢谢。这有助于在 cygwin 下构建 bsdgames。
  • 如何查看此命令的日志以确保一切正常?
【解决方案2】:

使用 xargs 和 grep:

find . -type f | grep php$ | xargs -n1 -i sed -i 's/hello/bonjour/' {}

它是这样工作的:

查找当前目录下的所有文件:

find . -type f

只包括那些以 php 结尾的文件:

grep php$

取出每一行并对其应用 sed:

xargs -n1 -i sed -i 's/hello/bonjour/' {}

【讨论】:

  • 首先,文件名中不要有空格! :) 其次,只需用引号括起来“{}”部分就可以了。
  • 不。 Grep/xargs 会杀死你的小猫。
  • @StephenGross:不,实际上。问题在于 xargs 及其分隔符的概念。
  • 啊,好点子。好吧,在这种情况下,我的第一个建议是:不要在文件名中添加空格。
  • @StephenGross:我从未听过的更不可行的建议。编写好的 shell 代码怎么样?
【解决方案3】:

关闭:

find -iname '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \;

或者

find -iname '*.php' -type f -print0 |
     xargs -0 sed -i 's/hello/bonjour/'

【讨论】:

  • 您提供的第一个解决方案不起作用。我还没有尝试过第二个,但 thiton 给出的解决方案更直接
  • @Erken:那是因为您在顶层目录中的文件比所描述的问题多。如果您不想扩展通配符,请学习引用它们。
猜你喜欢
  • 2023-01-17
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 2011-08-23
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
相关资源
最近更新 更多