0

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

2 回答 2

1

粗鲁但有效:

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

编辑:

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

更复杂,但一次将整个文件拉入保存空间:

sed -n 'H;${x;s/^[^(]*(//;s/)[^)]*$//;p;}' filename
于 2013-11-20T13:20:47.140 回答
0

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变量中。当 a )later 出现时,它会打印缓冲区(以及当前行到 last )),并将该行的其余部分缓冲到b.

于 2016-03-17T16:53:47.533 回答