2013-04-11 3 views
4

В Awk шаблон диапазона не является выражением, поэтому canot использует «!». не это. , так как его реализовать (печать всего содержимого EXCEPT соответствия шаблону диапазона с использованием awk)?Печать всего содержимого ЗАВЕРШЕНИЕ соответствия шаблону диапазона с использованием awk

например.

$ кошка 1.T

abd 
hfdh 
# 
fafa 
deafa 
123 
# 
end 

В результате я хотел:

кошки 1.T

abd 
hfdh 
end 

EDIT:

Я дал дерзкий пример. endpattern должен отличаться от начального шаблона, потому что я просто не тестировал это. Это моя ошибка.

В то же время, я хочу по-разному использовать шаблон диапазона и шаблон диапазона. Так что sed не мой выбор.

+1

+1 для вашего сложного примера текста! – Kent

ответ

6

Вы только что дали хитроумный (я не знаю, что я должен назвать это хорошим или плохим^_ ^) примером. Текст имеет точно такое же startpattern и endpattern (#)

Я предполагаю, что вы ищете так же, как sed '/#/,/#/d' или sed -n '/#/,/#/!p'

Существует несколько похожа (не такие же, как СЕПГ) адрес модели в AWK. На странице человека есть объяснение. Я сказал не то же самое, ваш пример хороший. если start == end адрес модель для AWK не будет работать:

kent$ echo "abd 
hfdh 
# 
fafa 
deafa 
123 
# 
end"|awk '/#/,/#/{next}1'                                     
abd 
hfdh 
fafa 
deafa 
123 
end 

, потому что AWK соответствует той же линии (снова проверьте страницу руководства), но если они различны, увидеть этот пример:

kent$ echo "abd 
hfdh 
# 
fafa 
deafa 
123 
## 
end"|awk '/#/,/##/{next}1' 
abd 
hfdh 
end 

он будет дайте то, что вы хотите.поэтому, если это так, вы можете просто сделать:

awk '/start/,/end/{next}1' 

Да, очень похоже, как у sed.

Если начало и конец действительно такие же, вы хотите сделать это с помощью awk, вам нужен флаг.

kent$ echo "abd 
hfdh 
# 
fafa 
deafa 
123 
# 
end"|awk '/#/&&!f{f=1;next}f&&/#/{f=0;next}!f' 
abd 
hfdh 
end 

хорошо, в примере лучше использовать ^#$, но это не главное. Надеюсь, это ответит на ваш вопрос.

+0

+1 для приятного объяснения –

+0

'awk '/ start /,/end/{next} 1'' правильный и подробный ответ на мой вопрос, хотя я не могу ясно объяснить это с помощью этого неудобного примера! –

0

Есть ли альтернатива?

$ sed '/#/,/#/d' input 
abd 
hfdh 
end 
0

Если вам действительно нужно использовать awk, что-то, как это должно работать:

awk 'BEGIN{x=1} /startpattern/{x=0} /endpattern/{x=1;next} x{print}' 

Хотя sed альтернативой может быть более простой подход (это меньше, набрав, по крайней мере).

Edit: @Kent указал, у вас есть один и тот же начальный и конечный рисунок, что делает его немного сложнее, но это должно работать:

awk 'BEGIN{x=1} /pattern/{x=!x;next} x{print}' 

Это в основном переключает x каждый раз, когда он видит картину, и только печатает, когда x!=0. В этом случае next избегает печати рисунка при повторном включении печати.

+0

это не сработает для примера OP, оно имеет одинаковые начальные и конечные шаблоны. Вам нужно проверить 'x' не только для печати, но и для установки самого' x'. – Kent

+0

@Kent хороший улов ... отредактирован в альтернативной версии, которая учитывает это. – twalberg