2010-03-06 56 views
2

我正在尋找搜索詞的每一次出現,例如, ddd,在一個文件中並輸出的環境中,這樣的:將周圍的單詞與匹配一起提取

FILE.TXT

aaa bbb ccc ddd eee fff 
ttt uuu iii eee ddd 
ddd 
ggg jjj kkk ddd lll 

輸出

ccc ddd eee 
eee ddd 
ddd 
kkk ddd lll 

作爲一個起點,我使用的這一段代碼

#!/usr/bin/perl -w  
while(<>) { 
    while (/ddd(\d{1,3}))/g) {  
    print "$1\n" 
    } 
} 
+0

是這個家庭作業? – ptomli 2010-03-06 06:07:46

回答

-1
#!/usr/bin/perl 

while (<>) { 
    chomp; 
    @F = split /\s+/; 
    if (/^ddd$/) {print $_."\n";next}; 
    for ($i=0; $i<=$#F;$i++) { 
     if ($F[$i] eq 'ddd') { 
      print "$F[$i-1] $F[$i] $F[$i + 1]\n"; 
     } 
    } 
} 
+0

如果「ddd」是第一個/最後一個單詞或唯一的單詞,則不起作用。 – 2010-03-06 10:41:19

1
#!/usr/bin/perl -w 
while (<>) { 
    if (/((?:[a-z]{3})?ddd(?: [a-z]{3})?)/) 
     print "$1\n"; 
} 
3

你可以嘗試following..it給你想要的輸出:

while(<>) { 
     if(/((?:\w+)?ddd(?: \w+)?)/) { 
       print "$1\n"; 
     } 
} 

正則表達式中使用:

(  # open the grouping. 
(?:\w+)? # an optional word of at least one char followed by a space. 
ddd  # 'ddd' 
(?: \w+)? # an optional space followed by a word of at least one char. 
)   # close the grouping. 
1
while (<>) { 
    chomp; 
    my @words = split; 
    for my $i (0..$#words) { 
     if ($words[$i] eq 'ddd') { 
      print join ' ', $i > 0 ? $words[$i-1] :(), $words[$i], $i < $#words ? $words[$i+1] :(); 
      print "\n"; 
     } 
    } 

}