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

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

这个问题类似于如何在每个 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 加正则表达式将液化感知者的神经,您的心灵在恐怖的袭击中枯萎。基于 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他来了她来这里是为了ICH或渗透埃斯阿尔我的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̸̡̪̯ͨ͊̽̅̾̎ş̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪ ̝͍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

相关内容