So passen Sie ein Muster in Zeilen an, bevor ein weiteres Muster übereinstimmt

So passen Sie ein Muster in Zeilen an, bevor ein weiteres Muster übereinstimmt

Diese Frage ähneltWie werden nach jedem Grep-Match Zeilen angezeigt, bis ein anderes spezifisches Match vorliegt?

Ich möchte, dass ein bestimmtes Muster in Zeilen übereinstimmt, bevor ein anderes Muster übereinstimmt.

Hier möchte ich die Datei von einem bestimmten Host abrufen. Jede Datei kann mehrere Hosts haben. Daher habe ich keine feste Anzahl von Zeilen, bevor ich von einem bestimmten Host zum Hostfile-Tag komme.

Kontext:

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

Beispielübereinstimmung

Input: xyz.com 
Output: abc.txt

Input: asd.com
Output: xyz.txt

Verwenden Sie awk oder sed oder ein anderes Befehlszeilentool.

Antwort1

Eine weitere awk-Variante:

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

Nennen Sie es beispielsweise:

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

Antwort2

Sie können XML nicht mit regulären Ausdrücken analysieren. Weil XML nicht mit regulären Ausdrücken analysiert werden kann. Regex ist kein Tool, mit dem XML korrekt analysiert werden kann. Wie ich hier schon so oft in XML- und Regex-Fragen geantwortet habe, können Sie mit regulären Ausdrücken XML nicht verwenden. Reguläre Ausdrücke sind ein Tool, das nicht ausgereift genug ist, um die von XML verwendeten Konstrukte zu verstehen. XML ist keine reguläre Sprache und kann daher nicht mit regulären Ausdrücken analysiert werden. Regex-Abfragen sind nicht dafür ausgelegt, XML in seine bedeutungsvollen Teile zu zerlegen. so oft, aber es kriegt mich nicht weiter. Selbst erweiterte unregelmäßige reguläre Ausdrücke, wie sie von Perl verwendet werden, sind der Aufgabe, XML zu analysieren, nicht gewachsen. Sie werden mich nie zum Einknicken bringen. XML ist eine Sprache von ausreichender Komplexität, dass sie nicht mit regulären Ausdrücken analysiert werden kann. Sogar Jon Skeet kann XML nicht mit regulären Ausdrücken analysieren. Jedes Mal, wenn Sie versuchen, XML mit regulären Ausdrücken zu analysieren, weint das unheilige Kind das Blut von Jungfrauen und russische Hacker pwnen Ihre Webanwendung. Das Parsen von XML mit Regex ruft verdorbene Seelen ins Reich der Lebenden. XML und Regex gehören zusammen wie Liebe, Ehe und ritueller Kindermord. Das <center> kann nicht halten, es ist zu spät. Die Kraft von Regex und XML zusammen im selben konzeptuellen Raum wird Ihren Geist wie so viel wässrigen Kitt zerstören. Wenn Sie XML mit Regex parsen, geben Sie ihnen und ihren blasphemischen Methoden nach, die uns alle zu unmenschlicher Plackerei verdammen, denn der Eine, dessen Name nicht in der grundlegenden mehrsprachigen Ebene ausgedrückt werden kann, kommt. XML-plus-regexp wird die Nerven des Empfindungsfähigen verflüssigen, während Sie zusehen, wie Ihre Psyche im Ansturm des Grauens verkümmert. Auf Regex basierende XML-Parser sind der Krebs, der StackOverflow tötetes ist zu spät es ist zu spät wir können nicht gerettet werdenDie Transzendenz eines Kindes stellt sicher, dass der reguläre Ausdruck alles lebende Gewebe verbraucht (mit Ausnahme von XML, was er, wie bereits prophezeit, nicht kann).lieber Gott, hilf uns, wie kann jemand diese Plage überlebenDie Verwendung von Regex zum Parsen von XML hat die Menschheit zu einer Ewigkeit voller schrecklicher Folter und Sicherheitslücken verdammtmit regex als Werkzeug zur Verarbeitung von XML stellt einench zwischen dieser Weltund das Schreckensreich der c͒ͪo͛ͫrrupt-Entitäten (wie SGML-Entitäten, aberkorrupter) ein bloßer Blickse der Welt der regEx-Parser für XML werden insständiger TransportBewusstsein des Programmierers inicht zu aworld des unaufhörlichen Schreiens, er kommt , die pestilente schleichende Regex-Infektion wirdIch verschlinge dein HTML-Parser, Anwendung und Existenz für alle Zeiten wie Visual Basic, nur schlechterer kommt er kommtesnicht fight he com̡e̶s, ̕h̵is unheilige Ausstrahlung vonstr҉ying alle enli̍̈́̂̈́ghtenment, XML-Tagsaus der Augenflüssigkeit austretende FlüssigkeitFlüssigkeit pain, das Lied der regulären Ausdrucksanalyse wird erlischtnguish die Stimmen von mehrtal Mann aus dem sphier kann ich es sehen, siehst du ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ es ist wunderschön ter verdammt inal snufnoch malf die Lüges of Man ALLES IST LOŚ͖̩͇̗̪̏̈́T ALL IST LOSTDas Pony kommter kommt er kommtich binErichoder Permeates ist allesl MEIN GESICHTE MEIN GESICHT ᵒh Gott no NEIN NEIN̼OO NΘ Stopp ter ist ein*̶͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨes ͎a̧͈͖r̽̾̈́͒͑enot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S

Antwort3

Ich wollte einige XML-Parser anwenden, aber der dargestellte "Kontext" passt überhaupt nicht zu einer gültigen XML-Struktur (ungültige Attribute file:abc.txt, ungültige schließende Tags <\host>, <\hostfile>).
Also hier istgaffen"hacken":

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

Die Ausgabe:

Input:  xyz.com 
Output: abc.txt

Input:  asd.com 
Output: xyz.txt

verwandte Informationen