我已经看到了几种在模式之间打印的解决方案,但我无法将各种东西放在一起以迎合我的问题。 我有一个文本文件,其中包含如下所示的视图定义,需要提取第一个和最后一个大括号之间的定义。 请注意:两者之间应有打开和闭合的支架。 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'
答案 0 :(得分:1)
原油但有效:
sed -n -e '/(/,/)/p' filename | sed '1s/[^(]*(//;$s/)[^)]*$//'
修改
(纠正了第一个解决方案。)
更复杂,但一次将整个文件拉入保留空间:
sed -n 'H;${x;s/^[^(]*(//;s/)[^)]*$//;p;}' filename
答案 1 :(得分: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
变量后,它会缓冲文本。当稍后出现)
时,它会打印缓冲区(以及当前行到最后)
),并将该行的其余部分缓冲到b
。