Bash: Диапазон Извлечения с Регулярным Expressioin (возможно, sed?)

У меня есть файл, который подобен этому:

<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

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

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

5
задан sixtyfootersdude 12 April 2010 в 14:48
поделиться

7 ответов

sed -n "/SUMMARY/,/END OF SUMMARY/p" fileName
8
ответ дан 13 December 2019 в 19:24
поделиться

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

sed -E -n -e '/^SUMMARY:/,/^END OF SUMMARY/{ /^SUMMARY:/d; /^END OF SUMMARY/d; p;}' file.txt 
1
ответ дан 13 December 2019 в 19:24
поделиться

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

perl -e 'print $1 if(`cat FILE_NAME`=~/SUMMARY:\n(.*?)END OF SUMMARY/s);'
1
ответ дан 13 December 2019 в 19:24
поделиться

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

sed '1,/SUMMARY/d;/END OF SUMMARY/,$d' filename
1
ответ дан 13 December 2019 в 19:24
поделиться

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

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

output

$ 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
ответ дан 13 December 2019 в 19:24
поделиться

Вот еще одна версия 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
ответ дан 13 December 2019 в 19:24
поделиться

Вы можете сделать это с помощью 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, но мне всегда нравится включать явную инициализацию.

Это работает с помощью флага echo (e), чтобы решить, находитесь ли вы в разделе резюме или нет.

0
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: