【问题标题】:unix find and replace text in dir and subdirsunix 查找和替换目录和子目录中的文本
【发布时间】:2012-02-13 12:45:50
【问题描述】:

我正在尝试在给定主目录和子目录中的所有文档中将“my-silly-home-page-name.html”的名称更改为“index.html”。

我看到了这个:Shell script - search and replace text in multiple files using a list of strings

还有这个:How to change all occurrences of a word in all files in a directory

我试过这个:

grep -r "my-silly-home-page-name.html" .

这会找到文本所在的行,但现在我想用“my-silly-home-page-name”替换“index”。 我将如何使用 sed 或 perl 执行此操作? 还是我什至需要 sed/perl?

类似:

grep -r "my-silly-home-page-name.html" . | sed 's/$1/'index'/g'

?

还有;我正在尝试使用 perl,并尝试以下操作:

perl -i -p -e 's/my-silly-home-page-name\.html/index\.html/g' *

这可行,但是当 perl 遇到目录时出现错误,提示“无法进行就地编辑:SOMEDIR-NAME 不是常规文件, 第 N 行”

谢谢, jml

【问题讨论】:

  • 我也在问一个关于 perl 的问题,一般来说,使用一种方法相对于另一种方法的优势是什么。
  • 我还特别想知道有关目录的 perl 问题的解决方案...

标签: perl unix sed grep replace


【解决方案1】:

这应该可以完成工作:

find . -type f -print0 | xargs -0 sed -e 's/my-silly-home-page-name\.html/index\.html/g' -i

基本上,它使用find 递归地收集给定目录(示例中为.)中的所有文件,并使用与xargs 问题中的perl 命令相同的替换命令运行sed .

关于sedperl 的问题,我想说你应该使用你更熟悉的那个,因为我不认为会有很大的差异(替换命令毕竟是同一个)。

【讨论】:

    【解决方案2】:

    可能有更好的方法可以做到这一点,但您可以使用:

    find . -name oldname.html |perl -e 'map { s/[\r\n]//g; $old = $_; s/oldname.txt$/newname.html/; rename  $old,$_  } <>';
    

    仅供参考,grep 搜索模式; find 搜索文件。

    【讨论】:

      【解决方案3】:
      find . -type f -exec \
         perl -i -pe's/my-silly-home-page-name(?=\.html)/index/g' {} +
      

      或者如果您的find 不支持-exec +

      find . -type f -print0 | xargs -0 \
         perl -i -pe's/my-silly-home-page-name(?=\.html)/index/g'
      

      两者都将尽可能多的名称作为参数传递给 Perl。两者都适用于任何文件名,包括那些包含换行符的文件。


      如果您在 Windows 上并且使用的是 Windows 版本的 Perl(而不是 cygwin 版本),除非您还备份原始版本,否则 -i 将不起作用。将 -i 更改为 -i.bak。然后,您可以使用

      删除备份
      find . -type f -name '*.bak' -delete
      

      【讨论】:

      • 效果更好(至少它写入更多文件),但我仍然收到有关“无法进行就地编辑”的错误。
      • @jml,哦!我认为您使用了缺少-type f 的代码。它只存在了几秒钟!这就是防止“不是常规文件”的原因。
      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2016-02-23
      • 2012-03-11
      • 2012-03-12
      相关资源
      最近更新 更多