Строка печати после сопоставления с шаблоном регулярного выражения

Я новичок в awk и застрял в этой проблеме. В основном я ищу шаблон, и я хочу разделить каждое совпадение с помощью "--", чтобы я мог легко использовать библиотеку yaml в рубине для анализа файла

awk '/(start)/,/(end)/' #awk command I am doing

Что я получаю:

start
foo
bar
end
start
foo2
bar2
end
start
foo3
bar3
end

Что я хочу:

start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end

Любые идеи?


person thunderousNinja    schedule 11.06.2013    source источник


Ответы (6)


Одна идея состоит в том, чтобы проверить, когда диапазон заканчивается, и напечатать эти тире. Поэтому я изменил неявное значение по умолчанию print на явное с таким условием:

awk '/start/,/end/ { print ( $0 ~ /end/ ) ? $0 "\n--" : $0 }' infile

Это дает:

start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
--
person Birei    schedule 11.06.2013
comment
Мы все любим Бирей! Не знаю, что значит меньше 3. Но даааа!! +1 - person jaypal singh; 12.06.2013
comment
Не делайте этого, так как это требует указания конечного условия дважды. - person Ed Morton; 12.06.2013

код для сед

sed '/end/a --' file
start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
--
person captcha    schedule 11.06.2013

Без использования диапазона адресов:

awk 'NR>1 && $1=="start" {print "--"} 1'
person glenn jackman    schedule 11.06.2013

awk (без диапазона адресов, только ОДНО условие):

awk '1;$0=="end" {print "--"}' file
person Endoro    schedule 11.06.2013

Использование /start/,/end/ никогда не является хорошей идеей, поскольку оно вводит дублирующийся код, если вы хотите просто выполнять тривиальные действия, такие как печать строки до/после блока или исключение строк, содержащих шаблон начала/конца. Просто держите это простым и явным:

$ awk '/start/{f=1} f; f&&/end/{print "--";f=0}' file
start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
--
person Ed Morton    schedule 12.06.2013
comment
Но, как я слышал, адрес может быть выполнен быстрее, чем тестирование каждой строки. Могу ли я получить более красивый код и платить быстрее? - person captcha; 12.06.2013
comment
О чем ты говоришь? - person Ed Morton; 13.06.2013

awk '1;/^end$/{print "--"}' file

1 печатает каждую строку безоговорочно. ("Если выражение 1 истинно, выполните действие по умолчанию, то есть print".)
Затем второй шаблон выводит --, но только если строка соответствует ^end$.

person hemflit    schedule 12.06.2013