2012-09-10 109 views
0

我搜索了很多,但我沒有找到適合我所尋找的答案,所以我發佈了這個問題。只提取字符串的第一次出現

我想提取'par','comp''order'和'nameprefix'的第一個出現。如何爲示例輸入做到這一點?有沒有perl的線索呢?

wertydhhdbc->auCdl = '(nil 
    par (xyz) 
    comp  asd1 
    order  (done) 
    namePrefix  "X" 
    par (xyz) 
    comp  asd 
    order  (done) 
    namePrefix  "R" 
    namePrefix  "X" 
    par (qwer) 
    comp  key 
    order  (done) 
    namePrefix  "X" 
    comp  key 
    order  (done) 
    par (qwer) 
    order  (done) 

回答

3

是的,則可以使用一個簡單的Perl onle-襯墊以顯示包含例如第一行par

perl -ne 'if (/par/) { print; last; }' 1.txt 

-n開關使perl的走了過來輸入文件一行一個。代碼然後讓它打印行並停止一旦找到給定的模式。

更新:

要搜索每個字的第一次出現,不同的技術,必須使用:

perl -ne 'if(/(comp|par|order)/) {$f{$1}++; print if 1 == $f{$1} ; last if 3 == keys %f}' 1.txt 

3是您正在搜索的單詞數。

+0

我能器。---我想要在同一oneliner提取字符串??????例如:if(/ par && comp && order /)或類似的方式? – unkaitha

+0

@unkaitha:查看更新。 – choroba

0

如何:

my ($par, $comp, $order, $nameprefix) = ($str =~ /par\s+(.+?)\s+comp\s+(.+?)\s+order\s+(.+?)\s+namePrefix\s+(.+?)\s/s); 
print "par=$par\ncomp=$comp\norder=$order\nnameprefix=$nameprefix\n"; 

輸出:

par=(xyz) 
comp=asd1 
order=(done) 
nameprefix="X" 
1

假設你想 '看齊','補償 '秩序' 和 'nameprefix' 中第一次出現的整條生產線。使用\b避免像orders

print $1 if $str =~ /(\b(?:par|comp|order|nameprefix)\b.+)/ 

匹配的話這將輸出

par (xyz) 
+0

+1 for \ b ................... –

相關問題