[РЕШЕНО] awk - печать только 1 вхождения для нескольких равных шаблонов

Задача: печать текста между тэгами, исключая вторые тэги и сами тэги, т.е. без строк # BEGIN<my tag>, # END<my tag>, Random Tag match…

#!/bin/bash

# эта строка не работает с пробелами в имени тэга
awk '/^# TBD<my tag/ { flag = 1; ++ctr } flag && ctr >= 2 { print } /^# END<my tag.*$/ { flag = 0 }' $0

# эта строка печатает всё, а нужен текст только первого тэга…
awk '/^# BEGIN<my tag/,/^# END<my tag.*$/' $0

exit

# BEGIN<my tag>
	Tag text
# END<my tag>
# BEGIN<my tag>
	Random Tag match…
# END<my tag>

P.S. файл-по умолчанию берётся из скрипта, так сделано у меня в run: http://victor-dobrov.narod.ru/share/unix-helper.7z
run служит для выполнения многих действий, для справки запустите его без параметров. (справка создаётся динамически)
Не совсем понял смысл, но, имхо, это проще сделать используя sed - удалить всё, что левее/правее определённого слова, включая само слово
PS - слово должно быть уникальным (но это похоже выполняется), а вот насчет 2-го вхождения не понял ...

EDIT 1 - и лучше привести образец строки: что имеется и что должно остаться
Ошибки не исчезают с опытом - они просто умнеют
Dobrov
печать текста между тэгами
Тоже не понятно, откуда авк будет дергать? Из run? опробуйте добавить в качестве разделителя брекеты тегов
 -F"<>"
Должно остаться только Tag text (в скрипте run это работает, но дублирующих шаблонов нет, а они могут быть…)
Задача: извлечь из тела скрипта $0 текст между двумя шаблонами, исключая сами шаблоны и используя только первое вхождение:
# BEGIN<my tag>
	Tag text
# END<my tag>
# BEGIN<my tag>
	Random Tag match…
# END<my tag>
sed также как awk захватывает всё, т.е. печатает и повторное вхождение шаблонов: строку Random Tag match…
sed -n '/^# BEGIN<my tag.*/,/^# END<my tag.*/p' $0| sed '1d;$d'
Dobrov
Должно остаться только Tag text (в скрипте run это работает, но дублирующих шаблонов нет, а они могут быть…)
Задача: извлечь из тела скрипта $0 текст между двумя шаблонами, исключая сами шаблоны и используя только первое вхождение:
# BEGIN<my tag>
	Tag text
# END<my tag>
# BEGIN<my tag>
	Random Tag match…
# END<my tag>

Образец нам так и не привели ... и я так и не понял ... тогда будем действовать в лоб, то есть возьмем этот пример за образец.
И так имеем
cat ~/test
# BEGIN<my tag>
	Tag text
# END<my tag>
# BEGIN<my tag>
	Random Tag match…
# END<my tag>
sed '/# BEGIN<my tag>/d;q' ~/test
	Tag text
Ошибки не исчезают с опытом - они просто умнеют
vasek
Образец нам так и не привели … и я так и не понял
Ваш вариант не работает, sed печатает только первую строку, а нужен только текст между двумя шаблонами, как это сделано в скрипте run: http://victor-dobrov.narod.ru/share/unix-helper.7z
#!/bin/bash

sed '/# BEGIN<my tag>/d;q' $0

# BEGIN<my tag>
	Tag text
		…
	end text
# END<my tag>
# BEGIN<my tag>
	Random Tag match, not printing…
# END<my tag>
Dobrov
печатает только первую строку
А это потому, что нужно было привести пример и подробнее описать (не зря просил) … какой был приведен пример, тот и был использован …
Но похорошему, имхо, лучше написать скрипт, в котором построчно читать нужный файл и выполнять нужный алгоритм - это будет понятнее.
Ошибки не исчезают с опытом - они просто умнеют
$ cat test | grep -v -m3 '<my tag>'
))
Ошибки в тексте-неповторимый стиль автора©
indeviral, Dobrov отсылает к своему файлу (лично я не любитель что то скачивать и смотреть) и не хочет пояснить ... но, насколько я понимаю, местоположение строки переменно (меняется в зависимости от соотвествующего тэга/запроса), и простой командой вряд ли обойдешься.
Чтобы построить алгоритм необходимо четко представлять всю эту кухню, а так одни гадания .... но могу и ошибаться.
Ошибки не исчезают с опытом - они просто умнеют
Навскидку, самое простое, когда между нужными тэгами 1 строка - читаем построчно файл, включаем счетчик, попался 1-ый нужный тэг BEGIN, вычисляем номер следующей нужной строки ... и выводим эту строку ... и дальше не читаем.
Если строк несколько, то нужно определять еще и номер строки, имеюшей тэг END ...
Ошибки не исчезают с опытом - они просто умнеют
 
Зарегистрироваться или войдите чтобы оставить сообщение.