sed를 사용하여 닫는 XML 태그를 추가하는 방법

sed를 사용하여 닫는 XML 태그를 추가하는 방법

XML 문서에 다음 예제가 있습니다.

<meta name=Originator content="text/html; charset=iso-8859-6">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 15"/>

다음 sed 명령을 실행할 때:

'/./{H;$!d} ; x ; s@<meta\([^/>]*\)>@<meta\1/>@g'

나는 다음과 같은 결과를 얻습니다.

<meta name=Originator content="text/html; charset=iso-8859-6">
<meta name=ProgId content=Word.Document/>
<meta name=Generator content="Microsoft Word 15"/>

첫 번째 예에서는 텍스트와 html 사이에 슬래시가 있기 때문에 닫는 슬래시가 누락되었습니다.

그러나 sed 명령을 다음과 같이 수정하면:

'/./{H;$!d} ; x ; s@<meta\([^>]*\)>@<meta\1/>@g'

그런 다음 세 번째 예에는 이중 슬래시가 있습니다.

<meta name=Originator content="text/html; charset=iso-8859-6"/>
<meta name=ProgId content=Word.Document/>
<meta name=Generator content="Microsoft Word 15"//>

두 경우를 모두 다루는 방법에 대한 아이디어가 있습니까?

답변1

늘 그렇듯이, 의무적인 경고를 포함해야 합니다. [XH]TML을 구문 분석하기 위해 간단한 텍스트 구문 분석 도구를 사용하는 것은 나쁜 생각입니다. 자주 실패하고 입력 변경에 강력하지 않으며 문서를 손상시키는 작업을 자동으로 수행할 가능성이 높습니다. 당신은해야언제나전용 XML 파서를 사용해 보세요.

즉, 다음 가정이 성립하는 경우 다음 솔루션을 사용할 수 있습니다.

  1. 태그 중 어느 것도 여러 줄에 걸쳐 있지 않습니다.
  2. 모든 <meta여는 태그(및 해당 태그만)는 a로 끝나야 합니다 />.
  3. 내부 태그를 가질 수 없습니다 >. 나는 실제로 이런 일이 일어날지 알 만큼 XML 사양을 잘 모릅니다. 아마도 name=?

위의 내용이 사실이라면 다음을 시도해 보세요.

$ sed -E 's|(<meta [^>]*[^/])>|\1/>|' file.xml 
<meta name=Originator content="text/html; charset=iso-8859-6/>
<meta name=ProgId content=Word.Documen/>
<meta name=Generator content="Microsoft Word 15"/>

관련 정보