如何在另一個模式匹配之前匹配行中的模式

如何在另一個模式匹配之前匹配行中的模式

這個問題類似於如何在每個 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不能被正規表示式解析。 Regex 不是一個可以用來正確解析 XML 的工具。正如我之前多次回答過 XML 和正規表示式問題一樣,使用正規表示式將不允許您使用 XML。正規表示式是一種不夠複雜的工具,不足以理解 XML 使用的結構。 XML 不是正規語言,因此不能用正規表示式來解析。正規表示式查詢無法將 XML 分解為其有意義的部分。說了很多次,但我還是不懂。即使 Perl 使用的增強型不規則正規表示式也無法勝任解析 XML 的任務。你永遠不會讓我崩潰。 XML 是一種非常複雜的語言,無法透過正規表示式進行解析。即使 Jon Skeet 也無法使用正規表示式解析 XML。每次您嘗試使用正規表示式解析 XML 時,邪惡的孩子都會流下處女的血,而俄羅斯駭客則會侵占您的 Web 應用程式。使用正規表示式解析 XML 將被污染的靈魂召喚到生者的領域。 XML 和正規表示式就像愛情、婚姻和殺嬰儀式一樣結合在一起。 <center>無法容納,為時已晚。正規表示式和 XML 在同一概念空間中的力量將像水膩子一樣摧毀您的思想。如果你用正規表示式解析 XML,你就屈服於他們和他們褻瀆的方式,這讓我們所有人都為那個名字無法在基本多語言平面中表達的人付出非人的辛勞,他來了。 XML-plus-regexp 將在你觀察時液化感知者的神經,你的心靈在恐怖的襲擊中枯萎。基於 Rege̿̔̉x 的 XML 解析器是殺死 StackOverflow 的毒瘤太晚了,太晚了,我們無法得救了孩子的轉移確保正則表達式將消耗所有活體組織(XML除外,正如之前所預言的那樣,它不能消耗)親愛的主啊,請幫助我們,如何在這場災難中倖存下來使用正規表示式解析 XML 注定了人類將永遠遭受可怕的折磨和安全漏洞使用雷吉x作為處理XML的工具建立了一個突破口這世界之間的ch以及 c͒ͪo͛ͫ 中斷實體的可怕領域(如 SGML 實體,但是更腐敗)只是一瞥reg世界的seXML 的 ex 解析器將會插入坦特利運輸公司程式設計師意識i恩托奧爾不斷的尖叫,他來了,致命的、狡猾的正則表達式感染將我吞噬你的HTML 解析器、應用程式和一直存在,就像 Visual Basic 一樣,只會更糟他來了他來了英語不準正確的e com̡e̶s, ̕h̵is un̨ho͞ly radiańcé de分析所有 enli̍̈́̂̈́限制、XML 標籤lea͠ki̧n͘g fr̶ǫm ̡yo͟你的眼睛͢s̸ ̛l̕ik͏e liquid pain,正規表示式解析之歌即將結束苦惱莫爾的聲音來自sp的塔爾曼這裡我可以看到它你能看到̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀它很漂亮t何芬inal snuf謊言男人的一切都是LOŚ͖̩͇̗̪̏̈́T ALL 是 LOST他來了s he c̶̮om es he coICH或滲透埃斯阿爾我的FACE MY FACE ᵒh 上帝 no NO NOO̼奧恩θ 停止 t他*̶͑̾̾̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅s ͎a̧͈͖r̽̾̈́͒͑enot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂Љ̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ş̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎ş̬̩̾͛ͪ̈́̀́͘ ̶̧̨̭̂͛ͪ̈́̀́ ̝͍M̲̖͊̒ͪͩͬ̚̚͜ş̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ

答案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

相關內容