awk或sed在第一次出现模式和最后一次出现模式之间打印文本



我已经看到了一些在模式之间打印的解决方案,但无法将它们组合在一起来解决我的问题。我有一个文本文件,其中包含如下所示的视图定义,并且需要提取第一个大括号和最后一个大括号之间的定义。请注意:有开放和封闭的大括号,它们之间应该打印。awk或sed中有解决方案吗?

create view view_name 
as(select column1 as someDATE,
    column2,
    column3,
    substring(convert(char(19),(DATEadd(hh,8,column4)),121),12) as someTIME,
    from table_name
    where NAME in('test')
    and column5='something')

所需输出:

select column1 as someDATE,
column2,
column3,
substring(convert(char(19),(DATEadd(hh,8,column4)),121),12) as someTIME,
from table_name
where NAME in('test')
and column5='something'

粗糙但有效:

sed -n -e '/(/,/)/p' filename | sed '1s/[^(]*(//;$s/)[^)]*$//'

编辑:

(更正了第一个解决方案。)

更复杂,但可以同时将整个文件拉入保留空间:

sed -n 'H;${x;s/^[^(]*(//;s/)[^)]*$//;p;}' filename

awk:中

awk '/(/&&!x{x=1;sub(/^[^(]*(/,"")} match($0,/)[^)]*$/)>0&&x{printf"%s",b substr($0,1,RSTART-1);b=substr($0,RSTART)"n";next} x{b=b$0"n"}' filename

它将自(首次出现(或)后来出现)以来的文本缓冲到b变量中。当)稍后出现时,它会打印缓冲区(以及截至最后一个)的当前行),并将该行的其余部分缓冲到b中。

最新更新