아래와 같은 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"}'
설명하다:
sed
/^<[^<]*>$/
연속적으로 열린 태그가 있는 경우N
-다음 입력 줄을 패턴 공간에 추가합니다./^<([^<]*)>\n<\/\1>$/
다음 줄에 동등한 닫는 태그가 있는지 확인합니다.- 그렇다면 명령을 통해 줄 번호를 인쇄하십시오
=
. 이는 둘러싸는 태그 줄 번호라는 점을 기억하세요. 우리는 그것을 하나 더 줄여야합니다.
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"