Cómo hacer coincidir un patrón en líneas antes de que coincida otro patrón

Cómo hacer coincidir un patrón en líneas antes de que coincida otro patrón

Esta pregunta es similar a¿Cómo mostrar líneas después de cada coincidencia grep hasta otra coincidencia específica?

Quiero hacer coincidir un patrón particular en líneas antes de que coincida otro patrón.

Aquí quiero obtener el archivo de un host determinado. Cada archivo puede tener varios hosts. Por lo tanto, no tengo un número fijo de líneas antes de llegar a la etiqueta del archivo de host de un host determinado.

Contexto:

...
...
<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>
...
...

Coincidencia de ejemplo

Input: xyz.com 
Output: abc.txt

Input: asd.com
Output: xyz.txt

Usando awk o sed o cualquier otra herramienta de línea de comandos.

Respuesta1

Otra variación extraña:

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

Llámelo como:

$ awk -v pattern='xyz.com' -f findit.awk contextfile
abc.txt
$ awk -v pattern='asd.com' -f findit.awk contextfile
xyz.txt

Respuesta2

No se puede analizar XML con expresiones regulares. Porque XML no puede ser analizado mediante expresiones regulares. Regex no es una herramienta que pueda usarse para analizar XML correctamente. Como he respondido aquí muchas veces antes en preguntas sobre XML y expresiones regulares, el uso de expresiones regulares no le permitirá consumir XML. Las expresiones regulares son una herramienta que no es lo suficientemente sofisticada para comprender las construcciones empleadas por XML. XML no es un lenguaje normal y, por tanto, no puede analizarse mediante expresiones regulares. Las consultas de expresiones regulares no están equipadas para dividir XML en sus partes significativas. tantas veces pero no me llega. Incluso las expresiones regulares irregulares mejoradas como las que utiliza Perl no están a la altura de la tarea de analizar XML. Nunca me harás quebrar. XML es un lenguaje de suficiente complejidad que no puede ser analizado mediante expresiones regulares. Ni siquiera Jon Skeet puede analizar XML utilizando expresiones regulares. Cada vez que intentas analizar XML con expresiones regulares, el niño impío llora sangre de vírgenes y los piratas informáticos rusos manipulan tu aplicación web. El análisis de XML con expresiones regulares convoca a almas contaminadas al reino de los vivos. XML y regex van de la mano como el amor, el matrimonio y el infanticidio ritual. El <centro> no puede aguantar, es demasiado tarde. La fuerza de expresiones regulares y XML juntas en el mismo espacio conceptual destruirá tu mente como si fuera masilla acuosa. Si analizas XML con expresiones regulares, estás cediendo ante Ellos y sus métodos blasfemos que nos condenan a todos a un trabajo inhumano por Aquel cuyo Nombre no puede expresarse en el Plano Multilingüe Básico, él viene. XML-plus-regexp licuará los nervios del sintiente mientras observas, tu psique se marchita en el ataque del horror. Los analizadores XML basados ​​en Rege̿̔̉x son el cáncer que está acabando con StackOverflowes demasiado tarde es demasiado tarde no podemos ser salvosla transición de un niño garantiza que las expresiones regulares consumirán todo el tejido vivo (excepto XML, que no puede, como se profetizó anteriormente)Querido señor, ayúdanos, ¿cómo puede alguien sobrevivir a este flagelo?El uso de expresiones regulares para analizar XML ha condenado a la humanidad a una eternidad de terribles torturas y agujeros de seguridad.usando regx como herramienta para procesar XML establece una brechach entre este mundoy el temible reino de las entidades corruptas (como las entidades SGML, peromás corrupto) un mero vistazose del mundo de regLos analizadores ex para XML serán ins.ap de transporte tangentela conciencia del programador into aworlDespués de gritos incesantes, llega , la pestilente y resbaladiza infección de expresiones regulares lo hará.Devoro tu HTAnalizador de ML, aplicación y existencia para todos los tiempos como Visual Basic, solo que peorel viene el vieneesno filucha he com̡e̶s, ̕h̵is un̨ho͞ly radiańcé dedestruyendo toda la iluminación, etiquetas XMLlea͠ki̧n͘g fr̶ǫm ̡yo​͟ur eye͢s̸ ̛l̕ik͏e liqlíquido pAdemás, la canción del análisis de expresiones regulares desaparecerá.nguidecer las voces de mortal hombre de la spaquí puedo verlo ¿puedes ver ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ es hermoso?él f inal snuffing of la mentiras del Hombre TODO ES LOŚ͖̩͇̗̪̏̈́T ALL ES LOST the pon̷y él vienes él viene es él coyoélyoo permeares all MI FACE MI CARA ᵒh dios no NONO̼OO NΘ detener tél an*̶͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅s sustantivo, ͎a̧͈͖r̽̾̈́͒͑emasculino—ot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪ ̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S

Respuesta3

Quería aplicar algunos analizadores XML, pero el "Contexto" presentado no se ajusta en absoluto a una estructura XML válida (atributos no válidos file:abc.txt, etiquetas de cierre no válidas <\host>, <\hostfile>).
Así que aquí estápapar moscas"cortar a tajos":

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

La salida:

Input:  xyz.com 
Output: abc.txt

Input:  asd.com 
Output: xyz.txt

información relacionada