【问题标题】:Print lines between two patterns to new file [closed]将两个模式之间的线条打印到新文件[关闭]
【发布时间】:2013-10-29 13:56:58
【问题描述】:

请帮帮我。我有以下模式的文件

ABC x  
bla bla bla  
bla bla  
bla  
XYZ  
ABC y   
bla bla bla  
bla bla  
bla bla bla  
XYZ  

ABC z  
bla bla bla
XYZ

我需要在文件 x.txt 中输出

ABC x  
bla bla bla  
bla bla  
bla    
XYZ  

ABC y   
bla bla bla  
bla bla  
bla bla bla  
XYZ 

在 y.txt 中,其余模式以此类推

【问题讨论】:

  • 您应该尝试提出具体问题,请查看常见问题解答

标签: regex perl unix sed


【解决方案1】:

有些是这样的:

awk '/ABC/ {close(f".txt");f=$2} {print >f".txt"}' file

这个测试如果行以ABC开头然后将输出文件名设置为$2中的值

埃克斯

cat y.txt
ABC y
bla bla bla
bla bla
bla bla bla
XYZ

编辑:将close() 添加到awk 以关闭打开的文件,这样在创建许多文件时它不会耗尽空间

【讨论】:

  • 为避免将空行打印到这些文件中,可以使用$0{print >f".txt},这样如果$0为空,则不匹配条件。
  • 这可能是好事,也可能是坏事。如果开始和结束模式之间有空格,它们也会丢失。
【解决方案2】:

好吧,将所有输入放入一个数组,使用正则表达式遍历该数组,直到找到 ABC 内容,打开 something.txt 作为输出,继续通过数组将行打印到输出,直到找到 XYZ 并继续。

我假设你知道如何编写 Perl。

【讨论】:

    【解决方案3】:

    怎么样:

    my $fh;
    open my $fh_in, '<', "input_file" or die "unable to open 'input_file: $!";
    while (<$fh_in>) {
        chomp;
        if (/^ABC \w+/../XYZ/) {
            if (/^ABC (\w+)/) {
                open $fh, '>', "$1.txt" or die "unable to open '$1.txt': $!";
            }
            print $fh $_,"\n";
        }
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用sed 进行操作,如下所示:

      sed -n '/ABC x/,/XYZ/p' file > x.txt
      

      如果你知道所有的模式,你可以使用循环:

      for i in x y z
      do
         sed -n "/ABC $i/,/XYZ/p" file > "$i".txt
      done
      

      【讨论】:

        【解决方案5】:
        awk '/ABC/{name="file "$2".txt";}{print >name}' your_file
        

        【讨论】:

          猜你喜欢
          • 2017-02-03
          • 2014-04-28
          • 2016-05-05
          • 1970-01-01
          • 2018-06-08
          • 2021-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多