Этот вопрос похож на Как отображать строки после каждого совпадения 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 или любого другого инструмента командной строки.
Еще один вариант 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
Я хотел применить некоторые синтаксические анализаторы 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