2013-11-20 57 views
0

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

输出reqired:

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

这将有助于了解围绕此模式的内容。我想剥去最后一个字符(右括号)和前24个字符是没用的。特别是:你如何认识到模式的结束?只能*通过正确计算开始和结束括号来完成*然后我会建议使用一个像样的解析器,而不仅仅是'sed'或'awk'。 – Alfe

+0

第一个左括号之前的字符数可能会有所不同,因为view_name可能会更改。至于最后一个右括号,则不会有其他字符。我希望能够找到最后发生的一种方法...当然,第一个 – user3013114

回答

1

原油,但有效:

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

编辑:

(校正后的第一溶液)

更复杂,但拉动整个文件进货舱空间在一次:

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

不会在我的测试中去掉右括号。 – Alfe

+0

@Alfe:谢谢,纠正... – Beta

+0

谢谢@Beta。这真的很有帮助。整天试图把1 + 1 = 2打破我的头。 – user3013114

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

相关问题