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