2014-10-21 2 views
-1

Может ли кто-нибудь предложить мне метод, в котором я мог бы извлечь несколько строк текста во время чтения.Perl условное извлечение строк из файла

файловая структура образца:

A blah blah string1 
B blah blah 
C blah string2 
D blah string3 blah 
E blah blah 
F blah string2 
G blah string3 blah 
H blah blah string1 
I blah blah 
J blah string2 

Здесь я хочу, чтобы извлечь строки, начинающиеся со строки «string1», а затем/закончилась «строке2» В действительности я хочу линии А-С и Н-J в приведенном выше примере.

Мои эксперименты терпят неудачу с наличием линии F, которую я хотел бы игнорировать.

ответ

0

Это может быть сделано, а в awk и sed, указав закономерности, между которыми вы хотите напечатать строки:

sed -n '/string1/,/string2/p' file 
awk '/string1/,/string2/' file 

В Perl вы можете сказать:

perl -e 'while (<>){print if (/string1/../string2/);}' file 

что эквивалентно до

perl -ne '{print if (/string1/../string2/)}' file 
    ^

Все из них возвращаются:

A blah blah string1 
B blah blah 
C blah string2 
H blah blah string1 
I blah blah 
J blah string2 
+0

Спасибо за быстрый ответ, я ищу PERL эквивалент для того же. – user1495523

+0

@ user1495523 см. Обновление с помощью подхода в Perl. – fedorqui

+0

@ user1495523 так ... это сработало? – fedorqui

1

Perl один лайнер и Flip-flop Operator ..:

$ perl -ne 'print if /\bstring1\b/ .. /\bstring2\b/' file 
A blah blah string1 
B blah blah 
C blah string2 
H blah blah string1 
I blah blah 
J blah string2 

\b в приведенном выше регулярное выражение называется границей слова. Он совпадает между символом слова characetr и символом без слова.

От Perl --help

-n    assume "while (<>) { ... }" loop around program 
-e program  one line of program (several -e's allowed, omit programfile) 
Смежные вопросы