2013-06-28 2 views
2

Каким образом можно извлечь и сохранить раздел текстового файла между двумя разделителями. Я хочу извлечь раздел, который начинается с Первое появление строки «TYPE A» и заканчивается первым вхождением «TYPE E».получить определенные строки из шаблона повторяющегося диапазона в текстовом файле

что-то вроде:

 
Some text, blah, blah, blah : TYPE A 
line 1 of text of my interest 
line 2 more text of my interest 
line 3 text of interest: TYPE A 
line 4 more and more 
line 5 more, now: TYPE A 
line 6 here is: TYPE B 
line 7 more and more text of my interest ... 
line 8 and now: TYPE E 
line 9 blah blah 

Т.е. Я хочу сохранить в другой файл что-нибудь между этими двумя разделителями - первый TYPE A включая все последующие и первые TYPE E. Это может исключить или включить эти два, потому что я действительно заинтересован в дальнейшей обработке того, что находится между ними. Я хотел бы сделать это с помощью sed или аналогичной утилиты, которую я мог бы найти на OSX или Linux, но не в Perl.

+0

Вы хотите включить строку, содержащую «ТИП А»? Вы хотите включить строки вывода «ТИП А» и «ТИП Е» на выходе? –

+0

glenn - Я сделал небольшое изменение, чтобы прояснить вашу мысль. – Edmon

ответ

4

С awk:

awk '/TYPE A/{p=1;next}/TYPE E/{print $0;p=0}p' inputFile > outputFile 

Выход:

$ awk '/TYPE A/{p=1;next}/TYPE E/{print $0;p=0}p' inputFile 
line 1 of text of my interest 
line 2 more text of my interest 
line 3 more and more text of my interest ... : TYPE E 
+0

Отлично, спасибо. – Edmon

+0

Я заметил, что не все после первого TYPE E удаляется с помощью этого кода. Мне пришлось вручную вырезать все после первого «TYPE E». Ты знаешь почему? – Edmon

4

Код для GNU :

 
$sed '/TYPE A/,/TYPE E/!d;{/TYPE A/d}' file 
line 1 of text of my interest 
line 2 more text of my interest 
line 3 more and more text of my interest ... : TYPE E 
+0

вы проверите мой расширенный пример и посмотрите, будет ли он работать с TYPE As и другой подобной строкой, проходящей до первого TYPE E? – Edmon

+0

@Edmon Он сохраняет весь текст после первого 'TYPE A' до' TYPE E', кроме строк с 'TYPE A' внутри. – captcha

4

Если у вас есть GNU AWK, вы можете установить регулярное выражение запись разделитель. Так что, если записи разделены «ТИП A» или «TYPE E», то вам просто нужно напечатать 2-й рекорд:

gawk -v RS='TYPE [AE]' 'FNR == 2' filename 

Опять же, GNU AWK.

+0

Удаляет 'TYPE E' и печатает две пустые строки до и после записи, но приятно! – captcha

+1

Хороший, ** + 1 **, но он включает символ новой строки после первого соответствия ТИПА. Это можно было бы избежать включать в переменную 'Record Separator', например' RS = 'TYPE [AE] [[: space:]] *' ' – Birei

2

Это может работать для вас (GNU СЭД):

sed -e '/TYPE A/,/TYPE E/{//!{wfile3' -e 'd}}' file1 >file2 

Это читает file1 пишет секции между (но не включая тех линий) FILE A и FILE E к file3, а остальные строки в file2.