Как добавить "," после каждого совпадения sed? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть этот код:

cat response_error.xml | sed  -ne  's#\s*<[^>]*>\s*##gp'  >> response_error.csv

но все Sed Match из XML связаны, например:

084521AntonioCallas 

Я хочу получить этот эффект

084521,Antonio,Callas, 

возможно ли это?

Я должен написать скрипт, который собирает XML-документы за предыдущий день, извлекает из них только данные без <...> и сохраняет эту информацию в CSV-файл следующим образом: 084521, Антонио, Каллас - информация, разделенная запятыми. 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 голосов
/ 03 апреля 2019

Если вы хотите проанализировать 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 - пережиток былых времен.

0 голосов
/ 16 апреля 2019

если ваши данные в файле 'd', попробуйте gnu sed:

sed -Ez 's/<[^>]*>//g;s/\n+|\s+/,/g;' d
0 голосов
/ 03 апреля 2019

Вы можете извлечь 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 всегда будет содержать строку, начинающуюся с имени и фамилии, разделенных пробелом.

...