每次sed匹配后如何添加“,”?

时间:2019-04-03 08:18:58

标签: bash sed text-processing

我有此代码:

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>   

3 个答案:

答案 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