【问题标题】:perl - extract list of stringsperl - 提取字符串列表
【发布时间】:2012-07-15 04:19:24
【问题描述】:

dummy.txt 包含:

gflkgWXYZ_123jfdknABC_8723879bfdkh873ABC_456jhb
gflkUI_12643jfdknABC_bfdk873WXYZ_7848jhb
ABC_1121fABC_22462
WXYZ_33273
3ABC_888

我正在尝试匹配所有这些 WXYZ_(可选数字),即 WXYZ_23 和 ABC_(可选数字)。即ABC_

什么 perl 脚本(我在没有 GNU 的 solaris 上运行)可以让我生成以下输出文件?

WXYZ_123
ABC_8723879
ABC_456
ABC_
WXYZ_7848
ABC_1121
ABC_22462
WXYZ_33273
ABC_888

【问题讨论】:

  • 这样的字符串可以换行吗?另外我知道您只想要 WXYZ 或 ABC,或者任何全大写的三个字母都可以?
  • 只寻找 WXYZ 或 ABC 而不是其他字符串组合

标签: regex linux perl unix grep


【解决方案1】:

使用这个正则表达式((ABC)|(WXYZ))_\d*

【讨论】:

  • 所以perl -pe '$_=join"\n",/((?:ABC|WXYZ)_\d*)/g,""' 将是最终脚本,只是为了完成答案。
【解决方案2】:

一种方式:

perl -ne '
    push @list, $1 while m/((?:WXYZ|ABC)_\d*)/g;
    END { 
        printf qq|%s\n|, join qq|\n|, @list;
    }
' infile

输出:

WXYZ_123                                                                                                                                                                                                                                     
ABC_8723879                                                                                                                                                                                                                                  
ABC_456                                                                                                                                                                                                                                      
ABC_                                                                                                                                                                                                                                         
WXYZ_7848                                                                                                                                                                                                                                    
ABC_1121                                                                                                                                                                                                                                     
ABC_22462                                                                                                                                                                                                                                    
WXYZ_33273                                                                                                                                                                                                                                   
ABC_888

【讨论】:

    【解决方案3】:

    必须是 Perl 吗?

    egrep -o '(WXYZ|ABC)_[0-9]*' dummy.txt
    

    【讨论】:

      【解决方案4】:

      burning_LEGION 是对的,尽管在非捕获括号内进行交替更容易。您还必须以某种方式收集结果。假设您只想要 ABC_ 或 WXYZ_ 而不是其他任何东西,试试这个简短的程序:

      #!/usr/bin/env perl
      
      use warnings;
      use strict;
      
      my @matches;
      open(FILE, '<', "dummy.txt") or die "Failed to open dummy.txt - $!\n";
      foreach (<FILE>) {
          1 while /((?:ABC|WXYZ)_\d*)/g && push(@matches, $1);
      }
      close(FILE) or die "Failed to close dummy.txt - $!\n";
      
      open(OUTPUT, '>', "output.txt") or die "Failed to open output.txt - $!\n";
      print OUTPUT join("\n", @matches);
      close(OUTPUT) or die "Failed to close output.txt - $!\n";
      
      exit 0;
      

      $cat 输出.txt
      WXYZ_123
      ABC_8723879
      ABC_456
      ABC_
      WXYZ_7848
      ABC_1121
      ABC_22462
      WXYZ_33273
      ABC_888

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 2016-01-18
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多