XML 위반으로 인해 XML 파서를 사용하여 구문 분석할 수 없는 XML과 유사한 텍스트 파일이 있습니다.
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
n
파일에서 열린 태그 뒤의 단어 만 잘라내고 싶습니다 . <
파일은 XML 구문이어야 하며 이는 행이 다를 수 있음을 의미합니다.
내 예상 결과는 다음과 같습니다.
1 - note
2 - to
3 - /to
4 - from
5 - /from
6 - heading
7 - /heading
8 - body
9 - /body
10 - /note
답변1
$ awk -F"[<>]" '{for(i=2;i<=NF;i+=2){print ++j" - "$i}}' input.xml
1 - note
2 - to
3 - /to
4 - from
5 - /from
6 - heading
7 - /heading
8 - body
9 - /body
10 - /note
답변2
참고: 이 답변은 사용자가 XML의 형식이 올바르지 않다고 설명하기 전에 작성되었습니다. 다른 사람들에게 도움이 될 수 있기 때문에 여기에 남깁니다.
XML 스타 XML 문서를 생성할 수 있는 요소 구조:
$ xml el file.xml
note
note/to
note/from
note/heading
note/body
이는 예상되는 출력과 다르지만 달성하려는 결과에는 충분할 수 있습니다.
또한 XML을 PYX로 변환하여 별도의 줄에 여는 태그와 닫는 태그를 표시할 수도 있습니다.
$ xml pyx file.xml
(note
-\n
(to
-Tove
)to
-\n
(from
-Jani
)from
-\n
(heading
-Reminder
)heading
-\n
(body
-Don't forget me this weekend!
)body
-\n
)note
이를 통해 원하는 출력을 쉽게 얻을 수 있습니다.
$ xml pyx file.xml | sed -n -e 's/^(//p' -e 's/^)/\//p'| nl
1 note
2 to
3 /to
4 from
5 /from
6 heading
7 /heading
8 body
9 /body
10 /note
이 sed
지침은 또는로 시작하지 않는 줄을 제거 (
하고 )
질문에 지정한 방식에 따라 해당 문자를 대체합니다. 이 nl
유틸리티는 줄에 줄 번호를 입력합니다.
XMLStarlet은 xmlstarlet
때때로 xml
.
답변3
grep
+awk
해결책:
grep -Eo '<[^<>]+>' input.xml | awk '{ gsub(/[<>]/,""); printf "%-3s - %s\n", NR, $0 }'
산출:
1 - note
2 - to
3 - /to
4 - from
5 - /from
6 - heading
7 - /heading
8 - body
9 - /body
10 - /note
또는 단일 GNU를 사용하십시오.awk
주문하다:
awk -v FPAT='</?[^<>]+>' '{ for(i=1;i<=NF;i++) printf "%-3s - %s\n", ++c, $i }' input.xml
답변4
이것은 주석, DTD, 자체 닫는 요소 등을 포함하는 투박한 XML을 포함하여 모든 XML에 대해 작동하는 솔루션을 원하는 경우를 위한 XQuery 솔루션입니다.
declare function local:f($e) {
$e / (name(), local:f(*), ('/' || name()))
};
for $tag at $p in local:f(/*)
return ($p || ' - ' || $tag || '
')