2013-11-20 1 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') 

необходимого потока:

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

Число символов перед первой открытой скобкой может меняться, поскольку имя вида может измениться. Что касается последней закрывающей круглой скобки, больше не будет символов. Я надеялся, что будет способ идентифицировать последнее происшествие ... и, конечно же, первое – user3013114

ответ

1

Crude, но эффективный:

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

РЕДАКТИРОВАТЬ:

(. Corrected первый раствор)

Более сложный, но тянет весь файл в трюм сразу:

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.