【问题标题】:find and replace in multiple files on command line在命令行的多个文件中查找和替换
【发布时间】:2010-12-26 03:11:25
【问题描述】:

如何在 unix 上的多个文件的命令行中查找和替换字符串?

【问题讨论】:

标签: unix command-line command-line-arguments


【解决方案1】:

类似于 Zombie 解决方案(我认为速度更快),但使用 sed(许多发行版和 OSX 的标准)而不是 Perl:

find . -name '*.py' | xargs sed -i .bak 's/foo/bar/g'

这将用 bar 替换当前目录下 Python 文件中所有出现的 foo 并使用 .py.bak 扩展名。

并删除 de .bak 文件:

find . -name "*.bak" -delete

【讨论】:

  • 这会影响搜索之外的空白。它似乎在我的每个文件的末尾添加了新行。
  • 不是每个版本的 sed 都支持 AFAIK 就地编辑;我认为这是一个 GNU 扩展。
  • 这是一个 gnu 扩展,至少在我的版本中它必须是 sed -i.bak(没有空格)
  • 我的版本与 -i 一起使用,无需指定 .bak 扩展名
  • 如果您有一个名为“.py”的文件夹,此操作将失败
【解决方案2】:

将 find 和 sed 与名称或带有空格的目录一起使用:

find . -name '*.py' -print0 | xargs -0 sed -i 's/foo/bar/g'

【讨论】:

    【解决方案3】:

    使用最近的 bash shell,并假设您不需要遍历目录

    for file in *.txt
    do
    while read -r line
    do
        echo ${line//find/replace} > temp        
    done <"file"
    mv temp "$file"
    done 
    

    【讨论】:

      【解决方案4】:

      我总是使用 ed 脚本ex 脚本

      for i in "$@"; do ex - "$i" << 'eof'; done
      %s/old/new/
      x
      eof
      

      ex 命令只是 vi 中的 : 行模式。

      【讨论】:

      • 这具有明显的优势,您可以执行更复杂的编辑。
      【解决方案5】:

      有很多方法。但答案之一是:

      find . -name '*.html' |xargs perl -pi -e 's/find/replace/g'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 2012-06-07
        • 2022-01-09
        • 1970-01-01
        • 2010-10-06
        • 2017-03-21
        相关资源
        最近更新 更多