ksh 스크립트를 사용하여 xml 파일의 일반 xml 형식 블록을 속성 형식 문자열로 변환하는 방법

ksh 스크립트를 사용하여 xml 파일의 일반 xml 형식 블록을 속성 형식 문자열로 변환하는 방법

자격 있는:

  1. 읽기 전용 권한이 없기 때문에 XML 파서 도구를 사용할 수 없습니다.

  2. 내 버전의 xmllint는 xpath를 지원하지 않습니다. 업데이트할 수 없으며 읽기 전용입니다.

  3. xmlstarlet이 없어서 설치할 수 없습니다.

내 옵션은 문자열 처리로 거의 제한됩니다.

사용자는 블록 이름이 될 입력 매개변수를 제공합니다.

그래서,

가정해보자

NAME=${USER_INPUT}

$NAME검색할 xml 블록을 검색하기 위해 매개변수로 사용하겠습니다 .

다음과 같이 xml 파일에서 이러한 일반 xml 블록을 어떻게 변환할 수 있습니까?

<block>
 <name>Bob</name>
 <address>USA</address>
 <email>[email protected]</email>
 <phone>1234567</phone>
</block>

<block>
 <name>Peter</name>
 <food>France</address>
 <cell>[email protected]</cell>
 <drinks>Coke</drinks>
 <car>Honda</car>
 <bike>Mountain bike</bike>
</block>

그래서 여기서 달성하고 싶은 것은 내 검색을 만족시키는 XML 덩어리를 얻는 것입니다.

예를 들어 NAME=Bob;

스크립트의 출력은 속성 파일 형식이어야 합니다.

name=Bob
address=USA
[email protected]
phone=1234567

여기서 고려해야 할 한 가지는 xml 형식이 블록마다 다르다는 것입니다. 각 xml 블록의 노드는 다릅니다.

답변1

-00Perl에는 레코드("줄")가 단일 문자가 아닌 빈 줄로 구분되는 멋진 "단락 모드"( )가 있습니다 \n. 이를 이용하면 매우 쉽게 관련 기록을 추출할 수 있습니다. 따라서 먼저 각 앞에 빈 줄이 있는지 확인한 <block>다음 단락 모드를 사용하여 검색하려는 내용을 찾으세요.

$ sed 's/<block>/\n<block>/' file | perl -00ne 'if(/<name>\s*bob\s*<\/name>/i){print}'
<block>
 <name>Bob</name>
 <address>USA</address>
 <email>[email protected]</email>
 <phone>1234567</phone>
</block>

이제 이를 쉘 스크립트로 포장하십시오(여기에서는 bash가 사용됨).

#!/bin/ksh

## Read the search strings
tag="$1"
value="$2"
target="file.xml" ## change this to whatever your xml file is called

## Search
sed 's/<.\?block>/\n/' "$target" |
    perl -00ne "if(/<$tag>\s*$value\s*<\/$tag>/i){
                   ## May as well do the formatting in Perl as well
                   s# *<([^/]+?)>#\1=#g;
                   s/<\/.+?>//g;
                   print
                 }"

그런 다음 태그 이름과 원하는 값을 입력으로 제공하여 스크립트를 실행합니다.

$ a.sh "name" "bob"
name=Bob
address=USA
[email protected]
phone=1234567

관련 정보