2016-10-03 2 views
0

У меня есть XML:чтения и конкатенации XML атрибуты, используя сценарий оболочки

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

Мне нужно, чтобы получить выход, как показано ниже, используя скрипт:

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

ИЛИ .. мы можем сделать это с 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) 
Смежные вопросы