2010-03-06 2 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

ответ

-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» является первым/последним словом или единственным словом. –

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"; 
     } 
} 

Regex используется:

(  # 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"; 
     } 
    } 

} 
Смежные вопросы