이 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"을 구분 기호로 사용합니다.