Bash: диапазон экстракта с регулярным экспрессионином (может быть, сед?) - PullRequest
5 голосов
/ 12 апреля 2010

У меня есть файл, похожий на этот:

<many lines of stuff>
SUMMARY:
<some lines of stuff>
END OF SUMMARY

Я хочу извлечь только то, что находится между SUMMARY и END OF SUMMARY. Я подозреваю, что могу сделать это с помощью sed, но я не уверен, как. Я знаю, что могу изменить что-то среднее между этим:

sed "/SUMMARY/,/END OF SUMMARY/ s/replace/with/" fileName

(но не уверен, как просто извлечь этот материал).

Я - Баш на Солярисе.

Ответы [ 7 ]

8 голосов
/ 12 апреля 2010
sed -n "/SUMMARY/,/END OF SUMMARY/p" fileName
1 голос
/ 12 апреля 2010

Это также должно работать с использованием (FreeBSD) sed:

sed -E -n -e '/^SUMMARY:/,/^END OF SUMMARY/{ /^SUMMARY:/d; /^END OF SUMMARY/d; p;}' file.txt 
1 голос
/ 12 апреля 2010

Если вы не хотите печатать линии маркера:

sed '1,/SUMMARY/d;/END OF SUMMARY/,$d' filename
1 голос
/ 12 апреля 2010

Если Perl в порядке, вы можете использовать:

perl -e 'print $1 if(`cat FILE_NAME`=~/SUMMARY:\n(.*?)END OF SUMMARY/s);'
0 голосов
/ 12 апреля 2010

Вот еще одна версия sed, выполняющая многострочную печать и выход (которая может быть полезна для извлечения диапазона строк из большого файла):

sed -E -n -e '/^SUMMARY:$/{n;h;};/^END OF SUMMARY$/!H;/^END OF SUMMARY$/{g;p;q;}' fileName | sed 1d 

Описание многострочного сценария sed довольно хорошо объяснено:

http://ilfilosofo.com/blog/2008/04/26/sed-multi-line-search-and-replace/

0 голосов
/ 12 апреля 2010

На Solaris используйте nawk

#!/bin/bash
nawk '
/SUMMARY/{
 gsub(".*SUMMARY:","");
 f=1
}
/END OF SUMMARY/{f=0;
 gsub("END OF SUMMARY.*","")
}f' file

выход

$ cat file
1 2 3 <many lines of stuff>
4 5 6 SUMMARY: 7 8 9
<some lines of stuff>
END OF SUMMARY blah
blah

$ ./shell.sh
 7 8 9
<some lines of stuff>
0 голосов
/ 12 апреля 2010

Вы можете сделать это с помощью awk:

$ echo 'many
lines
of
stuff
SUMMARY:
this is the summary
over two lines
END OF SUMMARY' | awk '
    BEGIN              {e=0}
    /^END OF SUMMARY$/ {e=0}
                       {if (e==1) {print}}
    /^SUMMARY:$/       {e=1}'

который выводит:

this is the summary
over two lines

Не во всех реализациях awk требуется условие BEGIN, но я всегда хотел бы включить явную инициализацию.

Он работает, используя флаг эха (e), чтобы определить, находитесь ли вы в сводном разделе или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...