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

indeviral
и так не работает(
хм, не тестировал такой случай, и вправду, если перед самым первым тегом идет текст то он тоже будет выведен
первое что пришло в голову для исправления:
awk '/Tag1/,/Tag2/' | awk '/Tag1/{next}/Tag2/{exit}1'
но думаю можно и короче
вот так будет нормально
echo "$a" | awk '/^# BEGIN<my tag>$/{i=1;next}/^# END<my tag>$/{exit}i'
общий шаблон
awk '/Tag1/{i=1;next}/Tag2/{exit}i'
У меня работает такой вариант
awk '/BEGIN/{flag=1;next}/END/{flag=0;exit}flag'
то есть
awk '/TAG1/{flag=1;next}/TAG2/{flag=0;exit}flag'
Ошибки не исчезают с опытом - они просто умнеют
Пошел топик на пользу по применению sed и awk ...

PS - но, имхо, когда смотришь на эти конструкции без подготовки, то ни хрена не понимаешь, что это такое и как это получилось ... СКРИПТ НАДЕЖНЕЕ
Ошибки не исчезают с опытом - они просто умнеют
vasek
когда смотришь на эти конструкции без подготовки, то ни хрена не понимаешь, что это такое и как это получилось …
ну если так рассуждать то
когда смотришь на sed и awk без подготовки, то ни хрена не понимаешь
когда смотришь на скрипты bash без подготовки, то ни хрена не понимаешь
когда смотришь на XXX без подготовки, то ни хрена не понимаешь

что в принципе верно для всего для чего нужна подготовка чтобы понимать
red
что в принципе верно для всего для чего нужна подготовка чтобы понимать
С этим не поспоришь .... как пример простенький скрипт на lisp (давно обучался на выводе температуры)
cat ~/…/temper.clp
#!/usr/bin/clisp
(princ "смотрим температуру: используя cat - 1, используя awk - 2:  ")
(set 'N (read))
(if (= N 1)
      (ext:run-program "cat" :arguments '("/sys/class/thermal/thermal_zone6/temp"))
      (if (= N 2)
             (ext:run-program "awk" :arguments '("{ print $1/1000 }" "/sys/class/thermal/thermal_zone6/temp"))
             (princ "Ошибка ввода - нет такого выбора")))
(bye)
Ошибки не исчезают с опытом - они просто умнеют
vasek
когда смотришь на эти конструкции без подготовки, то ни хрена не понимаешь… СКРИПТ НАДЕЖНЕЕ
Нет, скрипт ненадёжен, т.к. может вести себя по разному в разных оболочках и их версиях (zsh, bash и прочие).
Лучше использовать sed или awk, т.к. их синтаксис стабильнее, чем у разных версий командных интерпретаторов.
Dobrov
Нет, скрипт ненадёжен, т.к. может вести себя по разному в разных оболочках и их версиях (zsh, bash и прочие).
Просто нужно использовать по назначению. А некоторые (в том числе и я) вообще не признают zsh, только bash/sh.
В части фразы "СКРИПТ НАДЕЖНЕЕ" имел ввиду то, что применение срипта при проведении определенных видов работ по анализу, намного удобнее, а использование однострочной конструкции и не всегда применимо.

Dobrov
Лучше использовать sed или awk, т.к. их синтаксис стабильнее
В части sed - это по существу редактор, в отличии от awk, который относится к языкам. Это на любителя - есть юзеры, которые в основном используют, например, perl
Ошибки не исчезают с опытом - они просто умнеют
Dobrov
Лучше использовать sed или awk
sed,awk,bash,zsh и т.д. в разных дистрибутивах компилируются с разными флагами, имеют кучу версий и могут иметь весьма значительные функциональные отличия.
Ошибки в тексте-неповторимый стиль автора©
tags='# <x_alls> ~/.xinitrc всех Desktop Environment (этот текст расположен в скрипте после команда exit)
xrdb ~/.Xresources
echo more commands…
# <x_i3>
echo i3wm commands…
# <x_end>'

awk "/^# <x_alls>/{i=1;next}/^# <x_i3/{exit}i" <<<$tags
Проблема данной команды в том, что поиск не работает, если указать маску <x_.*> во втором шаблоне

Задача: завершить печать, когда в печатаемом тексте встретится любой тэг, т.е. строка '# <x_.*>'.
т.е. вывести текст между первым указанным тэгом-шаблоном и следующим, который может быть любым: '# <x_.*>'
 
Зарегистрироваться или войдите чтобы оставить сообщение.