我有一個用于連接 xml 的 shell 腳本。xmls 上的格式如下:
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
...
</ns2:Message>
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
</DataPDU>
問題是在運行shell進行連接之后:
#!usr/bin/sh
ORIGIN_PATH="/backup/data/export/imatchISO"
HISTORY_PATH="/backup/data/batch/hist"
SEND_PATH="/backup/data/batch/output"
DATE=`date %y%m%d`
LOG="/backup/data/batch/log/concatIMatch_"$DATE
echo $(date " %Y-%m-%d %H:%M:%S") >> $LOG
echo "-----------------------------------------------------" >> $LOG
echo "-----------------------------------------------------" >> $LOG
echo "-----STARTING INTELLIMATCH FILES CONTACTENATION------" >> $LOG
echo "-----------------------------------------------------" >> $LOG
echo "-----------------------------------------------------" >> $LOG
echo $(date " %Y-%m-%d %H:%M:%S")" - Starting..." >> $LOG
echo $(date " %Y-%m-%d %H:%M:%S")" - Cambiando ruta de trabajo " $ORIGIN_PATH >> $LOG
cd $ORIGIN_PATH
echo $(date " %Y-%m-%d %H:%M:%S")" - Listando contenido previo al concatenado" >> $LOG
ls -lrt >> $LOG
echo $(date " %Y-%m-%d %H:%M:%S")" - Comenzando concatenado de ficheros 053" >> $LOG
cat $ORIGIN_PATH/SWIFTCAMT053_* >> $SEND_PATH/SWIFTCAMT053.XML_$DATE 2>> $LOG
echo $(date " %Y-%m-%d %H:%M:%S")" - Historificando ficheros..." >> $LOG
mv $ORIGIN_PATH/SWIFTCAMT053_* $HISTORY_PATH >> $LOG 2>> $LOG
if [[ $(ls -A $SEND_PATH/SWIFTCAMT053.XML_$DATE) ]]; then
echo $(date " %Y-%m-%d %H:%M:%S")" - Ficheros 053 concatenados" >> $LOG
mv $SEND_PATH/SWIFTCAMT053.XML_$DATE $SEND_PATH/SWIFTCAMT053.XML 2>> $LOG
exit 0
else
echo $(date " %Y-%m-%d %H:%M:%S")" - ??ERROR CON LOS FICHEROS 053 AL CONCATENAR!" >> $LOG
exit 1
fi
echo $(date " %Y-%m-%d %H:%M:%S")" - FIN" >> $LOG
得到的檔案的最終結構是:
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
...
</ns2:Message>
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
</DataPDU>
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
...
</ns2:Message>
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
</DataPDU>
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
...
</ns2:Message>
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
</DataPDU>
這是無效的,因為它復制了初始
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0"> <ns2:Revision>2.0.13</ns2:Revision>
如果我手動洗掉這些 xml 檔案可以作業,但是我可以用 shell 腳本做些什么來解決這個問題?
我需要的預期 XML 是:
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
</DataPDU>
因此,DataPDU 的單個開始標簽以及該標簽內所有其他檔案的所有內容。
我當前的 shell 腳本的問題是,將一個 xml 的內容附加到前一個的下方,而需要將它們全部放在同一個 XML 標記中。
uj5u.com熱心網友回復:
雖然我建議在評論中為每個 @tripleee 使用適當的 XML 實用程式,但如果您可以使用awk,您也許可以使用以下內容:
$ awk 'NR<3 {print} FNR>3 {print last} {last=$0} END{print}' *.xml
NR<3 {print}列印處理的前兩行。
FNR>3 {print last} {last=$0}列印處理的每個檔案的第 3 行到第 n-1 行。
END{print}列印處理的最后一行。
輸出:
$ awk 'NR<3 {print} FNR>3 {print last} {last=$0} END{print}' *.xml
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
m1
</ns2:Message>
</ns2:Header>
<ns2:Body>
b1
</ns2:Body>
<ns2:Header>
<ns2:Message>
m2
</ns2:Message>
</ns2:Header>
<ns2:Body>
b2
</ns2:Body>
<ns2:Header>
<ns2:Message>
m3
</ns2:Message>
</ns2:Header>
<ns2:Body>
b3
</ns2:Body>
</DataPDU>
*.xml 檔案的內容:
$ cat *.xml
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
m1
</ns2:Message>
</ns2:Header>
<ns2:Body>
b1
</ns2:Body>
</DataPDU>
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
m2
</ns2:Message>
</ns2:Header>
<ns2:Body>
b2
</ns2:Body>
</DataPDU>
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
m3
</ns2:Message>
</ns2:Header>
<ns2:Body>
b3
</ns2:Body>
</DataPDU>
您還可以將awk命令放入接受 2 個引數的 bash 腳本中:源 xml 目錄和保存連接 XML 的檔案的名稱。
腳本內容:
#!/bin/bash
xml_dir="$1"
output_xml_file="$2"
awk 'NR<3 {print} FNR>3 {print last} {last=$0} END{print}' "$xml_dir/"*.xml > "$output_xml_file"
腳本用法:
# before script is run the output.xml file does not exist
$ ls output.xml
ls: output.xml: No such file or directory
# execute the script passing 2 parameters
$ ./script /tmp/t_dir output.xml
# after script execution, the output.xml file now exists and contains the concatenated xml
$ ls output.xml
output.xml
buck:t_dir buck$ cat output.xml
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
<ns2:Message>
m1
</ns2:Message>
</ns2:Header>
<ns2:Body>
b1
</ns2:Body>
<ns2:Header>
<ns2:Message>
m2
</ns2:Message>
</ns2:Header>
<ns2:Body>
b2
</ns2:Body>
<ns2:Header>
<ns2:Message>
m3
</ns2:Message>
</ns2:Header>
<ns2:Body>
b3
</ns2:Body>
</DataPDU>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515325.html
標籤:xml重击壳
