리눅스 + xml 파일에서 값을 캡처하는 방법 [중복]

리눅스 + 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"

답변2

나는 당신이 원하는 것을 얻기 위해 다음과 같은 것을 시도했습니다.

sed 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1\n/g' input.txt > out.txt

큰 따옴표 안의 부분 문자열을 검색하고(큰 따옴표 안은 아님) input.txt 파일의 각 줄에서 해당 부분 문자열을 모두 가져옵니다. 새 줄 "\n"을 구분 기호로 사용합니다.

관련 정보