XML과 같은 텍스트 파일에서 단어가 포함된 n번째 "<" 기호를 찾는 방법은 무엇입니까?

XML과 같은 텍스트 파일에서 단어가 포함된 n번째 "<" 기호를 찾는 방법은 무엇입니까?

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 || '&#xa;')

관련 정보