【问题标题】:Batch replace text inside text file (Linux/OSX Commandline)批量替换文本文件中的文本(Linux/OSX 命令行)
【发布时间】:2012-11-02 02:30:29
【问题描述】:

我有数百个文件需要更改其中的部分文本。

例如,我想将“http://”的每个实例替换为“rtmp://”。

文件具有 .txt 扩展名,分布在多个文件夹和子文件夹中。

我基本上是在寻找一种方法/脚本,它可以遍历每个文件夹/子文件夹和每个文件,如果它在该文件中找到“http”的出现,则将其替换为“rtmp”。

【问题讨论】:

    标签: unix command-line replace text-files batch-processing


    【解决方案1】:

    您可以结合使用findsed

    find . -type f -name \*.txt -exec sed -i.bak 's|http://|rtmp://|g' {} +
    

    这将创建每个文件的备份。我建议您检查一些以确保它符合您的要求,然后您可以使用删除它们

    find . -name \*.bak -delete
    

    【讨论】:

    • 感谢您的快速回答!但是,如何将命令限制为仅 .txt 文件?因为我在文件夹中确实有其他文件,jpgs 等。
    • @user1596553 将 Kevin 的脚本更改为 find . -type f -name '*.txt' -exec sed -i.bak 's|http://|rtmp://|g' {} +
    • 谢谢你们!我得到错误发现:-exec CMD 必须以 ';' 结尾但是我到底应该把“;”放在哪里?
    • 凯文,我能够修改这条线并按照我的意愿弯曲它。你刚刚为我节省了几个小时的工作时间。谢谢。
    【解决方案2】:

    这是我用来执行此操作的 zsh 函数:

    change () {
            from=$1 
            shift
            to=$1 
            shift
            for file in $*
            do
                    perl -i.bak -p -e "s{$from}{$to}g;" $file
                    echo "Changing $from to $to in $file"
            done
    }
    

    它利用良好的 Perl 机制来创建备份文件并修改指定文件。您可以使用上面的方法来遍历文件:

    zsh$ change http:// rtmp:// **/*.html
    

    或者只是把它放在一个简单的 #!/bin/zsh 脚本中(我只是使用 zsh 来实现强大的 globbing)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2017-07-09
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2016-05-15
      相关资源
      最近更新 更多