【问题标题】:Bash: any command to replace strings in text files?Bash:有什么命令可以替换文本文件中的字符串?
【发布时间】:2011-02-21 01:21:15
【问题描述】:

我有一个包含许多文本文件的目录层次结构。我想每次出现在一个文件中时搜索一个特定的文本字符串,然后用另一个字符串替换它。例如,我可能想用“Pepsi”替换字符串“Coke”的每一次出现。有谁知道如何做到这一点?我想知道是否有某种 Bash 命令可以做到这一点,而不必在编辑器中加载所有这些文件,或者想出一个更复杂的脚本来做到这一点。

我发现this page 解释了一个使用 sed 的技巧,但它似乎不适用于子目录中的文件。

【问题讨论】:

  • 我讨厌这种情况。在 3 分钟内非常接近的四个答案。有时回答这些问题会变成一场竞赛……压力很大……等待顶部的黄色条显示“加载答案”
  • 你们中的许多人提交了有效的建议。我接受 theatrus 的只是因为他先回复。

标签: bash shell replace text-processing


【解决方案1】:

sedfind 结合使用。例如:

find . -name "*.txt" | xargs sed -i s/Coke/Pepsi/g

find . -name "*.txt" -exec sed -i s/Coke/Pepsi/g {} \;

(有关更多信息,请参阅 find 的手册页)

【讨论】:

  • 另外,如果您正在使用findxargs 的组合,尤其是在脚本中,最好使用find -print0xargs -0,以防止带有空格的文件以他们的名义
  • @mikez302:请考虑 Martin 的评论。 xargs 通常不是必需的,通常应与-0 开关一起使用。第二种解决方案要好得多。
  • 如果您使用+ 而不是; 作为-exec 的分隔符,find 还可以选择为所有结果只生成一个进程:find . -name '*.txt' -exec sed -i 's/Coke/Pepsi/g' '{}' +
【解决方案2】:

我通常用 perl 来做。但是请注意 - 它使用比普通字符串替换更强大的正则表达式:

% perl -pi -e 's/Coke/Pepsi/g;' $filename

编辑我忘了子目录

% find ./ -exec perl -pi -e 's/Coke/Pepsi/g;' {} \;

【讨论】:

    【解决方案3】:

    IMO,这个任务最容易使用的工具是rpl

    rpl -R Coke Pepsi .
    

    (-R 用于递归替换所有子目录)

    【讨论】:

    【解决方案4】:

    像这样将 sed 与 find 结合起来:

    find . -name "file.*" -exec sed -i 's/Coke/Pepsi/g' {} \;
    

    【讨论】:

      【解决方案5】:

      find . -type f -exec sed -i 's/old-word/new-word/g' {} \;

      【讨论】:

        【解决方案6】:

        您想要findsed 的组合

        【讨论】:

          【解决方案7】:

          您还可以:

          用 find & ed 搜索和替换

          http://codesnippets.joyent.com/posts/show/2299

          (还具有通过 -t 标志的测试模式)

          【讨论】:

            猜你喜欢
            • 2020-12-25
            • 1970-01-01
            • 2015-08-07
            • 1970-01-01
            • 2012-04-21
            • 2020-09-02
            • 1970-01-01
            • 1970-01-01
            • 2017-03-06
            相关资源
            最近更新 更多