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

Усложним задачу?
Те же яйца - напечатать текст между двумя шаблонами, но в профиль: использовать N-e вхождение, например, второе.
Может есть что-то попроще, чем этот монстр:
[anode@TM-8481 ~]$ N=2 sed -n $(($(sed -n '/^# BEGIN<my tag>/=' mytagtest | sed -n "${N}p")+1)),$(($(sed -n '/^# END<my tag>/=' mytagtest | sed -n "${N}p")-1))p mytagtest
        Tag text 2222
4444444444444444444444
4444444444444444444444
55555555555frfrfrfrfrf
w   r45rf4fftftgyg  66
anode, жду когда вклинится red и замутит комбинацию на awk

sed и awk, конечно, значительно сокращают команды, но, имхо, не всегда удобно их использовать, а главное требуют напряжения извилин, которые у меня уже усыхают.

anode
Усложним задачу?
Все, больше не усложняюсь ... задачу максимум выполнил - показал молодежи два момента - окружение и использование переменной bash в awk

PS - хотя на bash использовать любое вхождение тоже не проблема (легко изменить) .... НО повторюсь - одна команда ... это впечетляет
Ошибки не исчезают с опытом - они просто умнеют
anode
Усложним задачу?
а можно упростить задачу? Те же тэги/шаблоны, только без BEGIN, END.
Начать печатать после тэга, закончить печать при совпадении строки с этим же тэгом:
# <my tag>
11111
22222
Last Line
# <my tag>
# <my tag>
Этот текст печатать нельзя!
Повторные шаблоны не нужны…
# <my tag>
vasek
Всегда вызывает восторг, когда смотрю на сложную конструкцию команды, собранной с использованием awk или sed
Везет вам, у меня эти конструкции вызывают ужас )))

Dobrov, так последний монстрик немного видоизмененный с этим справится:
[anode@TM-8481 ~]$ sed -n $(($(sed -n '/^# <my tag>/=' mytagtest | sed -n "1p")+1)),$(($(sed -n '/^# <my tag>/=' mytagtest | sed -n "2p")-1))p mytagtest
11111
22222
Last Line
anode спасибо за помошь! Взял вариант с исключением повторных тэгов.
Использую для подключения функций из конца скрипта (чтобы не загромождать его начало) или при отсутствии нужного файла беру его из скрипта.
#!/bin/bash

tagfile(){ # [1 force] html-tag name [file] [source]: текст, заключённый в тег, из $0|$3 в файл
	flag=$(($1>0));(($1))&& shift; tagfile="${2:-/tmp/$1}"; tmp=$(which "${tagfile##*/}" 2>/dev/null) && tagfile="$tmp"
	[[ -d $tagfile ]]&& return 1 #в $PATH нет исполняемого файла с именем тэга или $2
	[[ ! -f $tagfile || ! -s $tagfile || $flag -gt 0 ]]&& sed -n '{/^# <'"$1"'>.*/,/^# <\/'"$1"'>.*/p};/^# <\/'"$1"'>.*/q' "${3:-$0}"| sed '1d;$d' >"$tagfile" #файл перезапишется, если он пуст или $1=1
	[[ ! -s $tagfile ]]&& return 1; chmod ugo+x "$tagfile" 2>/dev/null && echo $tagfile # исполняемый файл
}
funct=$(tagfile funct)&& . $funct || { echo .source Error;exit;}
checkinclude
cat $(tagfile txt)
exit

# <funct>
checkinclude(){
echo include OK
}
# </funct>
# <txt>
this is text file
# </txt>
vasek
жду когда вклинится red и замутит комбинацию на awk
ну раз такое дело
не знаю, правильно ли я понял задачу, но вроде как-то так (для первого вхождения):
a='# BEGIN<my tag>
  Tag text1
  Tag text2
# END<my tag>
лалала
# BEGIN<my tag>
  Tag text3
  Tag text4
# END<my tag>
лалала'
echo "$a" |awk '/^# BEGIN<my tag>$/{next}/^# END<my tag>$/{exit}1'
выведет
  Tag text1
  Tag text2

если нужно для всех строк между тегами то
echo "$a" |awk '/^# BEGIN<my tag>$/{i=1;next}/^# END<my tag>$/{i=0}i'
напечатает
  Tag text1
  Tag text2
  Tag text3
  Tag text4
red
awk '/^# BEGIN<my tag>$/{next}/^# END<my tag>$/{exit}1'
да, по сравнению с sed конструкция короче ... но есть один минус - насколько я понял нужно писать всю строку (# BEGIN<my tag>)
Но, имхо, хоть конструкции на sed и awk в одну строку изящные, но для полного анализа скрипт (bash, perl, awk ...) удобнее/информативнее, конечно все зависит от цели.
Ошибки не исчезают с опытом - они просто умнеют
vasek
но есть один минус - насколько я понял нужно писать всю строку (# BEGIN<my tag>)
в смысле ? там ведь регулярное выражение и при желании можно укоротить до того что нужно
в общем виде будет
awk '/Tag1/{next}/Tag2/{exit}1'
red
там регулярное выражение, при желании можно укоротить до того что нужно
Виноват, бегло смотрел, не заметил ......... но конструкция намного короче .... awk '/TAG1/{next}/TAG2/{exit}1'

PS - в принципе awk это язык программирования, а значит и больше возможностей ... и даже можно писать скрипты ... никак не могу заняться им
Ошибки не исчезают с опытом - они просто умнеют
a='text
# BEGIN<my tag>
Tag text2
# END<my tag>
...'

и так не работает(
Ошибки в тексте-неповторимый стиль автора©
 
Зарегистрироваться или войдите чтобы оставить сообщение.