【问题标题】:Shell script to recursively browse a directory and replace a string递归浏览目录并替换字符串的 Shell 脚本
【发布时间】:2010-09-12 13:38:35
【问题描述】:

我需要递归搜索目录并在找到的所有文件中将一个字符串(比如http://development:port/URI)替换为另一个(比如http://production:port/URI)。有人可以帮忙吗?

如果该脚本可以打印出它修改的文件并将搜索/替换模式作为输入参数,那就更好了。

问候。

【问题讨论】:

  • 什么平台?你会接受哪些语言?

标签: regex scripting


【解决方案1】:

听起来你会从间接层中受益。 (但是,谁不会呢?)

我认为您可以将特殊字符串仅放在一个位置。要么在运行时引用配置设置,要么在构建时使用正确的字符串生成这些文件。

【讨论】:

    【解决方案2】:

    试试这个:

    find . -type f | xargs grep -l development | xargs perl -i.bak -p -e 's(http://development)(http://production)g'
    

    另一种反馈稍多的方法:

    find . -type f | while read file
    do
        grep development $file && echo "modifying $file" && perl -i.bak -p -e 's(http://development)(http://prodution)g' $file
    done
    

    希望这会有所帮助。

    【讨论】:

    • 注意,旧文件会保存为*.bak,间接满足要求:“打印出它修改过的文件”。
    【解决方案3】:

    找到 . -类型 f | xargs sed -i s/模式/替换/g

    【讨论】:

    • 额外说明:您必须在模式中使用反斜杠转义引号:... sed -i s/\"hello\"/hi/g
    • 导致invalid command code ...... 我得到的最远的结果是:find iPhone_Src/ -type f | xargs sed -i '' -e's/__MyCompanyName__/Samsung Electronics, Inc./g'.... 但即使这样也只能完成一半,给sed: iPhone_Src//GUI: in-place editing only works for regular files... .. 清单:find iPhone_Src/ -type f | xargs grep -1 -C 0 Copyright 2>/dev/null | grep -v Samsung | head Binary file iPhone_Src//image/demo_bt_feedback.png matches iPhone_Src//main.m:// Copyright __MyCompanyName__ 2010. All rights reserved. etc. etc.
    【解决方案4】:

    使用zsh,因此使用高级全局搜索您只能使用一个命令。 例如:

    sed -i 's:pattern:target:g' ./**
    

    HTH

    【讨论】:

      【解决方案5】:

      不要在有效的 SVN/CVS 目录中尝试上述操作,因为它还会修补 .svn/.cvs,这绝对不是您想要的。例如,要避免 .svn 修改,请使用:

      find . -type f | fgrep -v .svn | xargs sed -i 's/pattern/replacement/g'
      

      【讨论】:

        猜你喜欢
        • 2014-11-24
        • 2016-04-21
        • 1970-01-01
        • 2016-09-03
        • 2017-10-17
        • 2016-10-28
        • 1970-01-01
        • 2015-01-23
        • 1970-01-01
        相关资源
        最近更新 更多