我有此代码:
cat response_error.xml | sed -ne 's#\s*<[^>]*>\s*##gp' >> response_error.csv
但是所有来自xml的sed匹配都是绑定的,例如:
084521AntonioCallas
我想获得这种效果
084521,Antonio,Callas,
有可能吗?
我必须编写一个脚本来收集前一天的XML文档,仅从中提取不包含<...>的数据,并以这种方式将这些信息保存到csv文件中:084521,Antonio,Callas-信息之间用逗号分隔。 XML看起来像这样:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GenerarInformeResponse xmlns="http://experian.servicios.CAIS">
<GenerarInformeResult>
<InformeResumen xmlns="http://experian.servicios.CAIS.V2">
<IdSuscriptor>084521</IdSuscriptor>
<ReferenciaConsulta>Antonio Callas 00000000</ReferenciaConsulta>
<Error>
<Codigo>0000</Codigo>
<Descripcion>OK</Descripcion>
</Error>
<Documento>
<TipoDocumento>
<Codigo>01</Codigo>
<Descripcion>NIF</Descripcion>
</TipoDocumento>
<NumeroDocumento>000000000</NumeroDocumento>
<PaisDocumento>
<Codigo>000</Codigo>
<Descripcion>ESPAÑA</Descripcion>
</PaisDocumento>
</Documento>
<Resumen>
<Nombre>
<Nombre1>XXX</Nombre1>
<Nombre2>XXX</Nombre2>
<ApellidosRazonSocial>XXX</ApellidosRazonSocial>
</Nombre>
<Direccion>
<Direccion>XXX</Direccion>
<NombreLocalidad>XXX</NombreLocalidad>
<CodigoLocalidad/>
<Provincia>
<Codigo>39</Codigo>
<Descripcion>XXX</Descripcion>
</Provincia>
<CodigoPostal>39012</CodigoPostal>
</Direccion>
<NumeroTotalOperacionesImpagadas>1</NumeroTotalOperacionesImpagadas>
<NumeroTotalCuotasImpagadas>0</NumeroTotalCuotasImpagadas>
<PeorSituacionPago>
<Codigo>6</Codigo>
<Descripcion>XXX</Descripcion>
</PeorSituacionPago>
<PeorSituacionPagoHistorica>
<Codigo>6</Codigo>
<Descripcion>XXX</Descripcion>
</PeorSituacionPagoHistorica>
<ImporteTotalImpagado>88.92</ImporteTotalImpagado>
<MaximoImporteImpagado>88.92</MaximoImporteImpagado>
<FechaMaximoImporteImpagado>
<DD>27</DD>
<MM>03</MM>
<AAAA>2019</AAAA>
</FechaMaximoImporteImpagado>
<FechaPeorSituaiconPagoHistorica>
<DD>27</DD>
<MM>03</MM>
<AAAA>2019</AAAA>
</FechaPeorSituaiconPagoHistorica>
<FechaAltaOperacionMasAntigua>
<DD>16</DD>
<MM>12</MM>
<AAAA>2015</AAAA>
</FechaAltaOperacionMasAntigua>
<FechaUltimaActualizacion>
<DD>27</DD>
<MM>03</MM>
<AAAA>2019</AAAA>
</FechaUltimaActualizacion>
</Resumen>
</InformeResumen>
</GenerarInformeResult>
</GenerarInformeResponse>
</s:Body>
</s:Envelope>
答案 0 :(得分:0)
您可以使用以下命令提取IdSuscriptor
:
xmllint --xpath '//*[local-name()="IdSuscriptor"]/text()' response_error.xml
和ReferenciaConsulta
使用以下命令:
xmllint --xpath '//*[local-name()="ReferenciaConsulta"]/text()' response_error.xml
要生成所需的IdSubscriptor,FirstName,LastName
,我将使用以下脚本:
id_suscriptor=$(xmllint --xpath '//*[local-name()="IdSuscriptor"]/text()' response_error.xml)
referencia_consulta=$(xmllint --xpath '//*[local-name()="IdSuscriptor"]/text()' response_error.xml)
first_name=$(echo "$referencia_consulta" | cut -f1)
last_name=$(echo "$referencia_consulta" | cut -f2)
echo "$id_suscriptor,$first_name,$last_name"
请注意,这假设ReferenciaConsulta
字段将始终包含以名字和姓氏开头并以空格分隔的字符串。
答案 1 :(得分:0)
如果要解析XML,请使用专用的XML解析器,例如Saxon。
如果您想使用一些有趣的不相关的尖括号来解析一个奇怪的文本文件,请尝试以下操作:
#! /bin/sed -nf
s/^<IdSuscriptor>\([0-9]\+\)<\/IdSuscriptor>/\1,/
t match1
b next
: match1
h
b
: next
s/^<ReferenciaConsulta>\([^ ]\+\) \([^ ]\+\) [0-9]\+<\/ReferenciaConsulta>/\1,\2,/
t match2
b
: match2
H
g
s/\n//
p
t
命令进行了替换,则 match1
跳至s
。否则b
跳到next
。
如果发生匹配,h
将匹配的字符串复制到保留空间中,b
停止处理当前行。
第二个s
命令以相同的方式工作,不同之处在于,在不匹配的情况下,b
继续下一行。
如果第二个匹配项H
将模式空间追加到保留空间,g
将保留空间复制到模式空间,s
删除两个匹配项之间的换行符,然后p
打印结果。
如果您不知道如何使用sed
进行操作,请不要尝试。尝试学习一种真正的编程语言,例如Perl或JavaScript或Python。 sed
是过去的遗物。
答案 2 :(得分:0)
如果您的数据位于“ d”文件中,请尝试使用gnu sed:
curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r .access_token