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

时间:2013-11-20 12:58:39

标签: unix sed awk grep nawk

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

2 个答案:

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