Linux + xmlファイルから値を取得する方法[冗長]

Linux + xmlファイルから値を取得する方法[冗長]

このxmlファイルのすべての値をキャプチャして、ファイルの値をout1.txtとして印刷したいと思います。

注 – XML の値は、二重括弧で囲まれた単語を表します。

  more input.txt

 <app name="UAT/ECC/Global/MES/1206/MRP-S23"   ear="UAT/ECC/Global/MES/1206/MRP-S23.ear" xml="UAT/ECC/Glal/ME/120/MRP-  S23.xml"/>
 <app name="OQ/ediedbn/adSFSF/adSFSF-CL" ear="OQ/ebn/aSF/adSF- CL.ear"  xml="OQ/ediedbn/adSFSF/adSSF-CL.xml"/>
 <app name="OQ/ediedbn/adaEBS/adOrBS-HR-CL"  ear="OQ/ediedbn/adOraS/araEBS- HR-CL.ear" xml="OQ/eddbn/aOraEBS/adOEBS-   HR-CL.xml"/>
 <app name="UAT/CZ/LIMS/T068_01/LIMS-QA-S03" ear="UAT/CZ/LIS/T068_01/LIS-QA-     .ear" xml="UAT/CZ/LIMS/T068_01/LIMS-QA-S03.xml"/>

more out1.txt

UAT/ECC/Global/MES/1206/MRP-S23
UAT/ECC/Glal/ME/120/MRP-S23.xml
OQ/ediedbn/adSFSF/adSFSF-CL
OQ/ebn/aSF/adSF- CL.ear
.
.
.

awk / perl oneliner、bashを使用してout1.txtファイルの値をキャプチャする方法を提案してください。

ベストアンサー1

awkを使用して、次のように入力ファイルを分割できます。

gv@debian:$ cat a.txt
<app name="UAT/ECC/Global/MES/1206/MRP-S23"   ear="UAT/ECC/Global/MES/1206/MRP-S23.ear" xml="UAT/ECC/Glal/ME/120/MRP-  S23.xml"/>
<app name="OQ/ediedbn/adSFSF/adSFSF-CL" ear="OQ/ebn/aSF/adSF- CL.ear"  xml="OQ/ediedbn/adSFSF/adSSF-CL.xml"/>
<app name="OQ/ediedbn/adaEBS/adOrBS-HR-CL"  ear="OQ/ediedbn/adOraS/araEBS- HR-CL.ear" xml="OQ/eddbn/aOraEBS/adOEBS-   HR-CL.xml"/>
<app name="UAT/CZ/LIMS/T068_01/LIMS-QA-S03" ear="UAT/CZ/LIS/T068_01/LIS-QA-     .ear" xml="UAT/CZ/LIMS/T068_01/LIMS-QA-S03.xml"/>

gv@debian:$ cat b.txt

gv@debian:$ awk -F"name=|ear=|xml=|/>" '{print $2} {print $4}' a.txt >b.txt

gv@debian:$ cat b.txt
"UAT/ECC/Global/MES/1206/MRP-S23"   
"UAT/ECC/Glal/ME/120/MRP-  S23.xml"
"OQ/ediedbn/adSFSF/adSFSF-CL" 
"OQ/ediedbn/adSFSF/adSSF-CL.xml"
"OQ/ediedbn/adaEBS/adOrBS-HR-CL"  
"OQ/eddbn/aOraEBS/adOEBS-   HR-CL.xml"
"UAT/CZ/LIMS/T068_01/LIMS-QA-S03" 
"UAT/CZ/LIMS/T068_01/LIMS-QA-S03.xml"

二重引用符を保持したくない場合は、次のようにsedを使用して二重引用符を削除できます。

gv@debian:$ sed -i 's/\"//g' b.txt
gv@debian:$ cat b.txt
UAT/ECC/Global/MES/1206/MRP-S23   
UAT/ECC/Glal/ME/120/MRP-  S23.xml
OQ/ediedbn/adSFSF/adSFSF-CL 
OQ/ediedbn/adSFSF/adSSF-CL.xml
OQ/ediedbn/adaEBS/adOrBS-HR-CL  
OQ/eddbn/aOraEBS/adOEBS-   HR-CL.xml
UAT/CZ/LIMS/T068_01/LIMS-QA-S03 
UAT/CZ/LIMS/T068_01/LIMS-QA-S03.xml

または、ライナーでawkをsedに接続します。

gv@debian:$ awk -F"name=|ear=|xml=|/>" '{print $2} {print $4}' a.txt |sed 's/\"//g' >b.txt

ヒント:各入力ファイル行のすべてのフィールドを出力ファイルの単一行に書き込むには{print $2 $4}(フィールドを同じ角括弧内に入れます)を使用します。

この awk メソッドの仕組みの鍵は、awk が複数の文字区切り文字と | で区切られた複数の区切り文字を受け入れることができることです。 (=または)。
awk 区切り文字は -F オプションで定義されます。

耳の値を保存する必要がある場合は、{print $4}を{print $3}に置き換えてください。

awkスライシングについては、awkで区切られたすべてのフィールドを見てください。

$ awk -F"name=|ear=|xml=|/>" '{print "Field1="$1} {print "Field2="$2} {print "Field3="$3} {print "Field4="$4}' a.txt
Field1=<app 
Field2="UAT/ECC/Global/MES/1206/MRP-S23"   
Field3="UAT/ECC/Global/MES/1206/MRP-S23.ear" 
Field4="UAT/ECC/Glal/ME/120/MRP-  S23.xml"
Field1=<app 
Field2="OQ/ediedbn/adSFSF/adSFSF-CL" 
Field3="OQ/ebn/aSF/adSF- CL.ear"  
Field4="OQ/ediedbn/adSFSF/adSSF-CL.xml"
Field1=<app 
Field2="OQ/ediedbn/adaEBS/adOrBS-HR-CL"  
Field3="OQ/ediedbn/adOraS/araEBS- HR-CL.ear" 
Field4="OQ/eddbn/aOraEBS/adOEBS-   HR-CL.xml"
Field1=<app 
Field2="UAT/CZ/LIMS/T068_01/LIMS-QA-S03" 
Field3="UAT/CZ/LIS/T068_01/LIS-QA-     .ear" 
Field4="UAT/CZ/LIMS/T068_01/LIMS-QA-S03.xml"

おすすめ記事