Как отобразить многострочный шаблон с начальным и конечным шаблонами на основе условия в шаблоне - PullRequest
0 голосов
/ 03 мая 2020

Как я могу просто напечатать блоки шаблонов, где у меня есть DFW-YYYY ... и игнорировать другие. Мой стартовый паттерн - ### Мой концевой паттерн - ##

Также шаблон линии DFW-YYYY может иметь несколько [] скобок. это не исправлено. Мне нужно сопоставить точную / частичную строку (которая может включать в себя [бла] скобки для совпадения.

Я видел статью, где весь шаблон помещается в буфер и печатается только при обнаружении конечного шаблона. Я ищу усовершенствование этого мыслительного процесса, который я печатаю условно, как только нахожу начальный и конечный блок шаблонов. Статья, о которой я говорю: Как печатать линии между двумя шаблонами, включающими или исключающими (в sed, AWK или Perl)?

I have a file like: 
xxx
xxx
###
xxx
zzz Problem Key: DFW-XXXXX [blah blah][blah blah][blah blah]
yyy
xxx
*##*
yyy
###
 zzz 
xxx 
yyy 
zzz Problem Key: DFW-YYYY [blah blah][blah blah]
*##* 
xxx 
xxx 
zzz 
yyy
### 
xxx 
zzz Problem Key: DFW-XXXXX [blah blah][blah blah][blah blah]  
yyy 
xxx
*##* ....

Шаблон, который я пытался улучшить, был:

awk 'flag{
        if (/*##*/)
           if  (print_flag =1 )
               {printf "%s", buf; flag=0; buf=""} /* only print if print_flag =1 */
           else 
               {  flag=0; buf=""} /* ignore pattern */
        else
            buf = buf $0 ORS

            /* peek into $0 and look for conditional pattern. 
              conditional pattern may have sq brackets like [] but not limited to one occurrence
              I could avoid spl chars if I could look for multiple small strings within $0.
              Like $0 ~ "x" and $0 ~ "y" and $0 ~ "z", this way spl. char matching can be avoided
              but conditional pattern can still be matched*/

              if ($0 ~ "conditional-pattern1" and $0 ~ "conditional-pattern2" and $0 !~ "conditional-pattern3")
                  print_flag=1
     }
     /###/ {flag=1}' <file-name>

But my if statements of looking into $0 value for condition and assigning/ checking print_flag is failing syntactically.

Any guidance on how this could be achieved.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

с gawk разделителем записей с несколькими символами, что-то вроде этого должно работать

$ awk -v RS='\n(*##*|###)' '!(NR%2) && /DFW-YYYY/' file


 zzz
xxx
yyy
zzz Problem Key: DFW-YYYY [blah blah][blah blah]

тест с вашим реальным шаблоном, который вы ищете.

0 голосов
/ 04 мая 2020

Я получил это, работая для меня как:

 awk 'flag{
    if (/*##*/)
       {printf "%s", buf ~ "conditional-pattern" ? buf : "" ; flag=0; buf=""}
    else
        buf = buf $0 ORS
 }
  /###/{flag=1} ' file.txt

Было выполнено несколько условных сопоставлений с:

{printf "% s", buf ~ "aaaaaa" && buf ~ " хххххх "? buf: ""; флаг = 0; ЬиЕ = ""}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...