파일 이름에 공백이 포함된 파일에서 xml 태그 값 추출

파일 이름에 공백이 포함된 파일에서 xml 태그 값 추출

"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-typeTemplateCodeLOBCODEXXPO_PHYS_INV_ADJ_ES_AS

xmlstarletXMLStarlet은 때때로 as 대신에 as로 설치될 수 있습니다 xml.


코드에 두 가지 문제가 있습니다.

  1. 명령 출력을 sed이라는 파일로 리디렉션합니다 $LOBCODE. 비어 있으면 $LOBCODE이 리디렉션이 실패합니다. 나는 당신이 원하는 것이 의 출력을 sed변수에 할당한다고 가정합니다 LOBCODE. 이는 위에 표시된 대로 명령 대체를 통해 수행됩니다. 이는 sedXML 데이터를 구문 분석하는 데 적합하지 않은 선택입니다.

  2. 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

관련 정보