我有一个类似的文件:
<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
(但不确定如何提取那些东西)。
我是Solaris上的Bash。
答案 0 :(得分:8)
sed -n "/SUMMARY/,/END OF SUMMARY/p" fileName
答案 1 :(得分:1)
如果Perl
没问题,您可以使用:
perl -e 'print $1 if(`cat FILE_NAME`=~/SUMMARY:\n(.*?)END OF SUMMARY/s);'
答案 2 :(得分:1)
如果您不想打印标记线:
sed '1,/SUMMARY/d;/END OF SUMMARY/,$d' filename
答案 3 :(得分:1)
这也应该使用(FreeBSD)sed:
sed -E -n -e '/^SUMMARY:/,/^END OF SUMMARY/{ /^SUMMARY:/d; /^END OF SUMMARY/d; p;}' file.txt
答案 4 :(得分:0)
您可以使用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
)来确定您是否在摘要部分。
答案 5 :(得分:0)
在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>
答案 6 :(得分:0)
这是另一个sed版本只是做一个多行打印&amp;退出(可能适合从大文件中提取一系列行):
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/