"EXXARS - 실제 재고 조정 보고서 US PDF_es_ES.xlf" 파일이 있습니다.
파일 데이터:
<header>
<prop-group name="ora_reconstruction">
<prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
<prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
</prop-group>
추출과 결과 사이의 값이 필요합니다. XXPO_PHYS_INV_ADJ_ES_ES 변수에 이 값이 필요합니다.
코코맨드가 작동하지 않아요
filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
sed -n 's:.*<prop prop-type="TemplateCode">\(.*\)</prop>.*:\1:p' filename > ${LOBCODE}
echo " --> ${LOBCODE}"
답변1
XML 파일의 형식이 올바르다고 가정합니다.
<?xml version="1.0"?>
<header>
<prop-group name="ora_reconstruction">
<prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
<prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
</prop-group>
</header>
사용XML 스타:
xmlfile='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$( xml sel -t -v '//prop[@prop-type="TemplateCode"]' "$xmlfile" )
이는 XMLStarlet을 사용하여 prop
속성이 다음과 같은 노드의 값을 추출합니다. 이 변수는 위의 XML을 통해 값을 가져옵니다.prop-type
TemplateCode
LOBCODE
XXPO_PHYS_INV_ADJ_ES_AS
xmlstarlet
XMLStarlet은 때때로 as 대신에 as로 설치될 수 있습니다 xml
.
코드에 두 가지 문제가 있습니다.
명령 출력을
sed
이라는 파일로 리디렉션합니다$LOBCODE
. 비어 있으면$LOBCODE
이 리디렉션이 실패합니다. 나는 당신이 원하는 것이 의 출력을sed
변수에 할당한다고 가정합니다LOBCODE
. 이는 위에 표시된 대로 명령 대체를 통해 수행됩니다. 이는sed
XML 데이터를 구문 분석하는 데 적합하지 않은 선택입니다.sed
이라는 파일을 사용하여 다음 작업을 수행하도록 지시합니다filename
.sed
변수 값filename
$
변수 이름 앞에 사용해야 합니다 . 또한 파일 이름에 공백이 있으므로 큰따옴표 변수 확장이 필요합니다(언제나어쨌든 그렇게 하세요). 따라서 사용해야 합니다"$filename"
(위 코드에서는 더 설명적인 변수 이름을 사용했습니다).
답변2
@Kusalananda의 답변은 매우 훌륭하지만, 답변이 있으면 xmllint
다음을 사용할 수 있습니다.
filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$(xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@prop-type='TemplateCode']/text()" "$filename")
노트:
prop-group
"ora-reconstruction" 속성 만 필요한 경우를 대비해 전체 경로 사양을 사용했습니다 . @Kusalananda의 접근 방식은 "TemplateCode" 속성이 있는 요소를 원한다고 가정합니다prop
. 어떤 접근 방식이 선호되는지는 데이터에 따라 다릅니다.text()
요소 내의 텍스트만 반환됩니다prop
. 그렇지 않으면xmllint
주변 요소도 반환됩니다.
중요한 부분을 사용한 실행 예:
$ xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@proptype='TemplateCode']/text()" "ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf"
XXPO_PHYS_INV_ADJ_ES_AS
답변3
$ cat test.xml
<header>
<prop-group name="ora_reconstruction">
<prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
<prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
</prop-group>
$ awk -F"[<>]" '/TemplateCode/{print $3;exit}' test.xml
XXPO_PHYS_INV_ADJ_ES_AS