2016-10-03 52 views
0

我有一個xml:閱讀並串連XML屬性使用shell腳本

<element attr1="val11" attr2="val12" attr3="val13" /> 
<element attr1="val21" attr2="val22" attr3="val23" /> 
<element attr1="val31" attr2="val32" attr3="val33" /> 

我需要得到像下面的輸出,它使用shell腳本:

val11(val13) 
val21(val23) 
val31(val33) 
+0

此XML似乎無效。 – yanana

回答

0
awk '{split($2,a,"=");split($4,b,"=");gsub(/"/,"",a[2]);gsub(/"/,"",b[2]);print a[2]"("b[2] ")"}' xml 
val11(val13) 
val21(val23) 
val31(val33) 
0

你也可以使用sed如下;

sed 's/^.*1="//g;s/" .*.="/(/;s/" \/>/)/g' yourXMl 

示例;

[email protected]:/tmp$ sed 's/^.*1="//g;s/" .*.="/(/;s/" \/>/)/g' t1 
val11(val13) 
val21(val23) 
val31(val33) 
1

AWK -F 'attR1位= 「| attr3 =」 |」' '{打印$ 2 「(」 $(NF-1) 「)」}' 文件

1

提取內容物的正確的方式從XML是一個活生生的XML解析器。XMLStarlet是onesuch。

注意,這需要你的數據是實際的XML,其現有的數據也並非沒有添加根元素。

xmlstarlet sel -t -m '//element' -v ./@attr1 -o '(' -v ./@attr3 -o ')' -n <<EOF 
<root> 
<element attr1="val11" attr2="val12" attr3="val13" /> 
<element attr1="val21" attr2="val22" attr3="val23" /> 
<element attr1="val31" attr2="val32" attr3="val33" /> 
</root> 
EOF 

爲了解釋這是如何工作:

  • -t開始一個新的模板
  • -m //element文檔名爲element任何地方的元素相匹配。
  • -v ./@attr1發射命名attr1
  • -o '('發射字面(作爲字符串
  • -v ./@attr3的屬性的內容發出命名attr3
  • -o ')'發射字面)作爲字符串
  • -n的屬性的內容發出字面換行

如果您希望能夠在沒有安裝XMLStarlet的計算機上運行此功能,您可以生成XSLT模板,並使用XSLTProc調用該模板,該模板已廣泛使用。

運行xmlstarlet sel -C -t -m '//element' -v ./@attr1 -o '(' -v ./@attr3 -o ')' -n發出下面的XSLT文件:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt"> 
    <xsl:output omit-xml-declaration="yes" indent="no"/> 
    <xsl:template match="/"> 
    <xsl:for-each select="//element"> 
     <xsl:call-template name="value-of-template"> 
     <xsl:with-param name="select" select="./@attr1"/> 
     </xsl:call-template> 
     <xsl:text>(</xsl:text> 
     <xsl:call-template name="value-of-template"> 
     <xsl:with-param name="select" select="./@attr3"/> 
     </xsl:call-template> 
     <xsl:text>)</xsl:text> 
     <xsl:value-of select="'&#10;'"/> 
    </xsl:for-each> 
    </xsl:template> 
    <xsl:template name="value-of-template"> 
    <xsl:param name="select"/> 
    <xsl:value-of select="$select"/> 
    <xsl:for-each select="exslt:node-set($select)[position()&gt;1]"> 
     <xsl:value-of select="'&#10;'"/> 
     <xsl:value-of select="."/> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

如果您保存此爲myproc.xslt,並運行xsltproc myproc.xslt - <input.xml,你會得到標準輸出所需的輸出。

0

OR ..我們可以用Perl做..

文件測試上CentOS7

貓這個過濾器,如下圖所示...

Tue Oct 04|22:41:36|[email protected][STATION]:/root/ga/scripts/temp> cat c.txt 
<element attr1="val11" attr2="val12" attr3="val13" /> 
<element attr1="val21" attr2="val22" attr3="val23" /> 
<element attr1="val31" attr2="val32" attr3="val33" /> 
Tue Oct 04|22:41:38|[email protected][STATION]:/root/ga/scripts/temp> cat c.txt |perl -pe 's/^.+r1=\"(.+?)\".+r3=\"(.+?)\" .*$/\1(\2)/g' 
val11(val13) 
val21(val23) 
val31(val33) 
Tue Oct 04|22:41:40|[email protected][STATION]:/root/ga/scripts/temp> 
0

AWK -F '[=「]' '{打印$ 3 」(「 $(NF-1) 」)「}' 文件

val11(val13) 
val21(val23) 
val31(val33)