У меня есть файл, который подобен этому:
<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 на Солярисе.
Это должно работать и с использованием (FreeBSD) sed:
sed -E -n -e '/^SUMMARY:/,/^END OF SUMMARY/{ /^SUMMARY:/d; /^END OF SUMMARY/d; p;}' file.txt
Если Perl
в порядке, вы можете использовать:
perl -e 'print $1 if(`cat FILE_NAME`=~/SUMMARY:\n(.*?)END OF SUMMARY/s);'
Если вы не хотите печатать строки маркера:
sed '1,/SUMMARY/d;/END OF SUMMARY/,$d' filename
В 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>
Вот еще одна версия 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/
Вы можете сделать это с помощью 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
), чтобы решить, находитесь ли вы в разделе резюме или нет.