【问题标题】:Read and write a file using Unix or Perl script [closed]使用 Unix 或 Perl 脚本读写文件 [关闭]
【发布时间】:2015-08-02 20:00:30
【问题描述】:

我是 Unix 新手,我想编写一个脚本来读取文件并将文件中的某些单词替换为其他单词。替换的操作并不难。但是如何通过 Unix 脚本读取文件的内容并对此进行“工作”,以及如何将结果写入新文件?

我应该使用哪些命令?

【问题讨论】:

    标签: perl file unix


    【解决方案1】:

    必须有一百万零一个在线教程以任何语言进行此操作。使用 sed 这很简单:

    sed 's/foo/replacement/' in.txt > out.txt
    

    或者作为 perl 单行:

    perl -ne 's/foo/replacement/g; print' in.txt > out.txt 
    

    在 perl 脚本中:

    use warnings;
    use strict; 
    
    open my $file, '<', 'in.txt' or die $!;
    open my $out, '>', 'out.txt' or die $!;
    
    while(<$file>){
        s/foo/replacement/g;
        print $out "$_\n";
    }
    

    --- in.txt ---

    foo
    bar
    baz
    one
    two
    three
    

    【讨论】:

    • 为什么chomp 并在输出时重新添加\n
    【解决方案2】:

    你可以试试 Perl 单行:

    perl -p -e 's/pattern/replace/g' /path/to/infile > /path/to/outfile
    

    您可以使用-i 标志进行就地替换:

    perl -pi -e 's/pattern/replace/g' /path/to/infile
    

    【讨论】:

      【解决方案3】:

      在 unix 中,您无需编程即可从 shell 和 bash 脚本读取和写入文件。

      例如

      echo "the quick brown fox jumps over the lazy cat" >test.txt
      

      会将此文本写入 test.txt 文件中。

      cat test.txt >test_copy.txt
      

      将读取文件并将其写入test_copy.txt

      这不是很有用,因为 cp 打字少,但是...

      您可以在两者之间添加小应用程序:

      cat test.txt | perl -p -e 's/cat/dog/' >corrected_test.txt
      

      这将调用 perl 将错误的动物替换为正确的动物。 -p 参数告诉 perl 在所有输入行上执行命令并将结果打印到输出。

      使用这些乐高积木,您可以构建有用的大型应用程序。

      例如创建一个 fix_cat.sh 文件(这将是一个 bash 脚本)

      #!/bin/bash
      cat $1 \
        | perl -n -p -e 's/cat/dog/' \
        > $2
      

      并执行 chmod +x fix_cat.sh,以使 bash 脚本可执行。 (行尾的 \ 表示让同一行在下一行继续,这样读起来更容易一些,并且可以方便地在其间添加更正。)

      现在可以

      $./fix_cat.sh test.txt new_text.txt
      

      您将在 new_text.txt

      中获得更正后的文本

      祝你好运。

      【讨论】:

      • @RobEarl 感谢 -n -p 修复。我不知道-p 包括-n。一个人每天都在学习。
      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      相关资源
      最近更新 更多