Как сопоставить шаблон в строках до другого сопоставления с образцом

Этот вопрос похож на Как отображать строки после каждого совпадения grep до другого конкретного совпадения?

Я хочу сопоставить определенный шаблон в строках перед другим сопоставлением с шаблоном.

Здесь я хочу получить файл с заданного хоста. У каждого файла может быть несколько хостов. Следовательно, у меня нет фиксированного количества строк, прежде чем я перейду к тегу hostfile с данного хоста.

Контекст:

...
...

    abc.com <\host>
    qwe.com <\host>
    xyz.com <\host>
<\hostfile>
...

    asd.com <\host>
<\hostfile>
...
...

Пример совпадения

Input: xyz.com 
Output: abc.txt

Input: asd.com
Output: xyz.txt

Использование awk, sed или любого другого инструмента командной строки.

0
01.06.2017, 02:03
2 ответа

Еще один вариант awk:

/^<hostfile file:/ {
        output=substr($2, 6, index($2, ">") - 6);
}
/<host>/ && $0 ~ pattern {
        print output
}

Назовите его так:

$ awk -v pattern='xyz.com' -f findit.awk contextfile
abc.txt
$ awk -v pattern='asd.com' -f findit.awk contextfile
xyz.txt
1
28.01.2020, 02:45

Я хотел применить некоторые синтаксические анализаторы XML, но представленный «Контекст» вообще не соответствует допустимой структуре XML (недопустимые атрибуты file:abc.txt, недопустимые закрывающие теги <\host >, <\hostfile>).
Итак, вот gawk "hack":

awk  'BEGIN{ RS="<hostfile" }/file:/{ f = substr($1,6,length($1)-6) }
      /<host>/{ match($0,/.*<host>([^<>]+)<\\host>[[:space:]]*<\\hostfile>.*$/,a);  
      printf("Input: %s\nOutput: %s\n\n",a[1],f)}' yourfile

Вывод:

Input:  xyz.com 
Output: abc.txt

Input:  asd.com 
Output: xyz.txt
0
28.01.2020, 02:45

Теги

Похожие вопросы