Bash:使用正则表达式提取范围(可能是sed?)

时间:2010-04-12 14:48:19

标签: regex bash unix sed

我有一个类似的文件:

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

我想只提取SUMMARYEND OF SUMMARY之间的内容。我怀疑我可以用sed这样做,但我不确定如何。我知道我可以用这个修改之间的东西:

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

(但不确定如何提取那些东西)。

我是Solaris上的Bash。

7 个答案:

答案 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/