【问题标题】:How to extract xml attributes with (g)awk如何使用 (g)awk 提取 xml 属性
【发布时间】:2019-11-10 08:54:24
【问题描述】:

所以我有这个 xml 行示例,正在从中读取,

<element attr1=”XX” attr2=”0818820\.x11” attr3=”YYXX.x11” attr-4=”1”/>

由于是xml,所以元素的顺序是随机的,有些可能是可选的。

所以我尝试使用 awk 选择其中一个,例如使用 gensub 的 attr1。

while (getline < "./file") {
    print $0
    #First attempt
    #print gensub(/.*attr1=\"(.*)\".*/,"\\1","g",$0)
    #Second attempt
    print gensub(/.*attr1="(.*)".*/,"\\1","g",$0)
}

但是,我没有设法匹配这个,但返回了整行(可能没有匹配,但它也可以匹配所有)。有人有想法吗?我将无法修改输入参数。

BR 帕特里克

【问题讨论】:

  • 正则表达式在修改 xml/html 数据时永远不会是健壮和合适的
  • @WiktorStribiżew 这些解决方案仅在 xml 行是单行时才有效。
  • 有人称它为summoning the daemon,其他人称它为the Call for Cthulhu,很少有人称它为turned mad and met the Pony。简而言之,永远不要使用正则表达式解析 XML 或 HTML!您是否尝试过诸如 xmlstarletxmllintxsltproc 之类的 XML 解析器?
  • @kvantour 没错,仅用于示例字符串。否则使用awk/sed等就没有意义了
  • You can't parse [X]HTML with regex。我建议使用 XML/HTML 解析器(例如 xmlstarlet)。

标签: xml awk


【解决方案1】:

假设输入在 file.txt 中

$ cat file.txt
<element attr1=”XX” attr2=”0818820\.x11” attr3=”YYXX.x11” attr-4=”1”/>

然后用grep把属性拉出来,然后在=上拆分。如下:

$  egrep -o "attr[0-9]+[^ ]* " file.txt | awk -F= '{print $1"\t"$2}'
attr1   ”XX” 
attr2   ”0818820\.x11” 
attr3   ”YYXX.x11” 

如果你只想要 attr1 也选择 attr1:

$  egrep -o "attr[0-9]+[^ ]* " file.txt | awk -F= '/attr1/{print $2}'
”XX” 

您可以调整 grep 行以获取其他属性。例如如果你想要 end 属性,插入空格会使逻辑更简单:

$ sed < file.txt 's|/| |g' | egrep -o "attr[^ ]* "
attr1=”XX” 
attr2=”0818820\.x11” 
attr3=”YYXX.x11” 
attr-4=”1” 

【讨论】:

    【解决方案2】:

    没有理由重新发明轮子。 gawk-xml documentation 提到了几个用于 awk 的 xml 解析器,例如 Jan Weber 的 getXML 脚本(在互联网上流传,我找到了 here)。测试它产生:

    $ awk -f getXML.awk test.xml
    TAG element
            attr-4=”1”
            attr1=”XX”
            attr2=”0818820\.x11”
            attr3=”YYXX.x11”
    END element
    

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多