perl – 提取string列表

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 

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

单程:

 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 

它需要成为Perl吗?

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

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