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

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

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

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

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

Контекст:

...
...
<hostfile file:abc.txt>
   <host> abc.com <\host>
   <host> qwe.com <\host>
   <host> xyz.com <\host>
<\hostfile>
...
<hostfile file:xyz.txt>
   <host> asd.com <\host>
<\hostfile>
...
...

Пример соответствия

Input: xyz.com 
Output: abc.txt

Input: asd.com
Output: xyz.txt

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

решение1

Еще одна вариация 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

решение2

Вы не можете разобрать XML с помощью регулярных выражений. Потому что XML не может быть разобран с помощью регулярных выражений. Regex — это не инструмент, который можно использовать для правильного разбора XML. Как я уже много раз отвечал в вопросах XML и регулярных выражений, использование регулярных выражений не позволит вам использовать XML. Регулярные выражения — это инструмент, который недостаточно сложен для понимания конструкций, используемых XML. XML не является регулярным языком и, следовательно, не может быть разобран регулярными выражениями. Запросы Regex не оснащены для разбиения XML на его значимые части. так много раз, но это не доходит до меня. Даже улучшенные нерегулярные регулярные выражения, используемые Perl, не справляются с задачей разбора XML. Вы никогда не заставите меня сломаться. XML — это язык достаточной сложности, чтобы его нельзя было разобрать с помощью регулярных выражений. Даже Джон Скит не может разобрать XML с помощью регулярных выражений. Каждый раз, когда вы пытаетесь разобрать XML с помощью регулярных выражений, нечестивое дитя проливает кровь девственниц, а русские хакеры взламывают ваше веб-приложение. Разбор XML с помощью регулярных выражений призывает испорченные души в царство живых. XML и регулярные выражения идут рука об руку, как любовь, брак и ритуальное детоубийство. <center> не может удержать его, слишком поздно. Сила регулярных выражений и XML вместе в одном концептуальном пространстве разрушит ваш разум, как водянистая замазка. Если вы разбираете XML с помощью регулярных выражений, вы поддаетесь Им и их кощунственным путям, которые обрекают нас всех на нечеловеческий труд ради Того, чье Имя не может быть выражено в Базовом Многоязычном Плане, он придет. XML-plus-regexp разжижает нервы разумных существ, пока вы наблюдаете, как ваша психика увядает под натиском ужаса. XML-парсеры на основе регулярных выражений — это рак, убивающий StackOverflowслишком поздно, слишком поздно, нас не спасти.трансгрессия потомка гарантирует, что регулярное выражение поглотит всю живую ткань (за исключением XML, который оно не может поглотить, как и было предсказано ранее)Господи, помоги нам, как кто-то может пережить это бедствие?использование регулярных выражений для разбора XML обрекли человечество на вечные ужасные пытки и дыры в безопасностис использованием regex как инструмент для обработки XML устанавливает брешьч между этим мироми ужасное царство коррумпированных сущностей (вроде сущностей SGML, ноболее коррумпированный) просто проблесксе мира регбывшие парсеры для XML будут insсрочно транспортировать apсознание программиста янет, ойорлd непрекращающегося крика, он приходит , пагубная скользкая регулярная инфекция будетЯ пожираю твой HTML-парсер, применение и существование на все времена как Visual Basic, только хужеон приходит он идетэсне фибой чe ком̡е̶с, ̕х̵иs нечестивое сияниеукрепление всего освещения, XML-тегите͠ки̧н͘г из̶м ̡ва̋͟ваших̸глаз͢с̸ ̛ли̕ик͏е ликuid pайн, песня разбора регулярных выражений будет продолжатьсятомят голоса большеtal человек из spздесь я вижу это, вы видите ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ это красиво tон е- inal snufе-е-еf ложьs Человека ВСЕ ПОТЕРЯНОЛЛ ЕСТЬ ЛОСТ йе пони он пришелон приезжает он приезжаетя с тонichили пропитыватьес альl МОЙ ФАЦЭ МОЕ ЛИЦО ᵒh god no НЕТ НЕТ̼ОО НΘ стоп тон*̶͑̾̾​̅ͫ͏̙̤г͇̫͛͆̾ͫ̑͆л͖͉̗̩̳̟̍ͫͥͨе̠̅с ͎a̧͈͖r̽̾̈́͒͑eнот рè̑ͧ̌аͨл̘̝̙̃ͤ͂̾̆ ЗА̡͊͠͝ЛГΌ ИСͮ̂҉̯͈͕̹̘̱ ТО͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝С̨̥̫͎̭ͯ̿̔̀ͅ

решение3

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

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

Связанный контент