자격 있는:
읽기 전용 권한이 없기 때문에 XML 파서 도구를 사용할 수 없습니다.
내 버전의 xmllint는 xpath를 지원하지 않습니다. 업데이트할 수 없으며 읽기 전용입니다.
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
-00
Perl에는 레코드("줄")가 단일 문자가 아닌 빈 줄로 구분되는 멋진 "단락 모드"( )가 있습니다 \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