Unix 명령을 사용하여 XML에서 패턴 찾기

Unix 명령을 사용하여 XML에서 패턴 찾기

아래와 같은 XML이 있습니다.

<a>
</a>
<a>
<b></b>
<c></c>
</a>

아래와 같이 중간에 레이블이 없는 두 개의 연속 행에 있는 빈 레이블의 행 번호를 찾아야 합니다.

    <a>
    </a>

Output: 1 -> line number

PCGREP을 사용하고 있는데 Unix 관리자가 perl 명령을 제한하거나 지원하지 않는데 SED나 AWK를 사용하여 수행할 수 있습니까? 참고: xmlstarlet도 지원되지 않습니다.

답변1

Sed 솔루션

#!/bin/bash

sed -nr '
    /^<[^<]*>$/ {
        N
        /^<([^<]*)>\n<\/\1>$/=
    }
' "$1" | awk '{print "Output: "$NF - 1" -> line number"}'

설명하다:

  1. sed
    • /^<[^<]*>$/연속적으로 열린 태그가 있는 경우
    • N-다음 입력 줄을 패턴 공간에 추가합니다.
    • /^<([^<]*)>\n<\/\1>$/다음 줄에 동등한 닫는 태그가 있는지 확인합니다.
    • 그렇다면 명령을 통해 줄 번호를 인쇄하십시오 =. 이는 둘러싸는 태그 줄 번호라는 점을 기억하세요. 우리는 그것을 하나 더 줄여야합니다.
  2. awk- 줄 번호를 줄여서 메시지 문자열에 출력합니다.

시험:

입력하다

<a>
</a>
<a>
<b></b>
<c></c>
<c>
</c>
</a>

산출

./empty_tag.sh input.txt 
Output: 1 -> line number
Output: 6 -> line number

AWK 솔루션

용법: ./empty_tag.sh input.txt

#!/bin/bash

awk -F'[>/]' '
    line_num {
        if(NF == 3) {print "Output: " line_num " -> line number";}
        line_num = 0;
    }
    NF == 2 {line_num = NR;}
' "$1"

관련 정보