perl - 提取字符串列表

时间:2012-07-16 10:12:59

标签: regex linux perl unix grep

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

一种方式:

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

答案 2 :(得分:3)

它需要是Perl吗?

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

答案 3 :(得分:1)

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 output.txt
  WXYZ_123
  ABC_8723879
  ABC_456
  ABC_
  WXYZ_7848
  ABC_1121
  ABC_22462
  WXYZ_33273
  ABC_888