パターンマッチの前にある行でパターンをマッチさせる方法

パターンマッチの前にある行でパターンをマッチさせる方法

この質問は各 grep 一致の後に他の特定の一致まで行を表示するにはどうすればよいでしょうか?

別のパターンが一致する前の行で特定のパターンを一致させたい。

ここでは、特定のホストからファイルを取得したいと考えています。各ファイルには複数のホストがある場合があります。したがって、特定のホストからホストファイル タグに到達するまでの行数は固定ではありません。

コンテクスト:

...
...
<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 は正規表現では解析できないからです。正規表現は、XML を正しく解析するために使用できるツールではありません。これまで何度もここで XML と正規表現に関する質問に回答してきたように、正規表現を使用しても XML を消費することはできません。正規表現は、XML が使用する構造を理解するには洗練度が不十分なツールです。XML は正規言語ではないため、正規表現では解析できません。正規表現クエリは、XML を意味のある部分に分解する機能を備えていません。何度も繰り返しましたが、私には理解できません。Perl で使用される拡張された不規則な正規表現でさえ、XML を解析するタスクには適していません。私を悩ませることはできません。XML は、正規表現では解析できないほど複雑な言語です。ジョン スキートでさえ、正規表現を使用して XML を解析することはできません。正規表現を使用して XML を解析しようとするたびに、邪悪な子供が処女の血を流し、ロシアのハッカーが Web アプリケーションを乗っ取ります。 XML を正規表現で解析すると、汚れた魂が生者の領域に召喚されます。XML と正規表現は、愛、結婚、儀式的な幼児殺害のように結びつきます。<center> はそれを保持できません。手遅れです。同じ概念空間で正規表現と XML が一緒になる力は、あなたの心を水っぽい粘土のように破壊します。XML を正規表現で解析すると、彼らとその冒涜的なやり方に屈することになります。その冒涜的なやり方は、私たち全員を、基本多言語面で名前を表現できない存在のために非人間的な労働に運命づけます。彼は来ます。XML プラス正規表現は、あなたが観察している間、知覚者の神経を溶かし、恐怖の猛攻撃で精神を萎縮させます。Rege̿̔̉x ベースの XML パーサーは、StackOverflow を殺している癌です。もう遅すぎる、もう遅すぎる、私たちは救われない子供の性転換により、正規表現がすべての生体組織を消費することが保証される(ただし、以前に予言されたように、XML は消費できない)。神様、助けてください。この災難から誰が生き残れるでしょうか正規表現を使用してXMLを解析すると、人類は永遠に恐ろしい拷問とセキュリティホールに陥る運命にある。レジを使用するXMLを処理するツールとしてのxは、この世界の間のそして、破壊されたエンティティの恐ろしい領域(SGMLエンティティのようなものだが、ほんの一瞥regの世界のseXML用のexパーサーはタントリー輸送APプログラマーの意識 iああオル絶え間ない叫び声のd、彼は来る、疫病のsl ithy正規表現感染は私はあなたのHTを貪りますMLパーサー、アプリケーション、そしてVisual Basicのような存在はずっと悪い彼は来るesしないght h来る、来る不気味な輝きすべてのエンライメント、XML タグを削除します目から液体が漏れるuid p正規表現の解析の歌は消え去るだろうモアの声を苦しめるSPからのタルマンここに見えますよ、見えますか̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀美しいですねtinal snuf嘘だ人類のすべては失われたLLはLですOST theポニーが来た彼が来ると、彼はs tイチまたは浸透するes al私のFACE 私の顔 ああ神様 nいやいやOO NΘ 停止 t彼は*̶͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅sn͎a̧͈͖r̽̾̈́͒͑eさんot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TああË͖́̉ ͠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

関連情報