다른 패턴에서 가장 가까운 패턴 행을 찾아 행 번호를 표시합니다.

다른 패턴에서 가장 가까운 패턴 행을 찾아 행 번호를 표시합니다.

일부 반복되는 부분이 포함된 매우 긴 XML 파일이 있습니다. 문자열 A에 가장 가까운 문자열 B가 나타나는 줄 번호를 찾고 싶습니다. 많은 인스턴스가 있다고 가정해 보겠습니다.

<section>
  ...
  <entry>
    <key>key-im-looking-for</key>
    ...
  </entry>
  ...
  <type>org.apache.whatever.package</type>
  ...
</section>

다음을 포함하는 줄 번호를 찾고 싶습니다.

key-im-looking-for

<type>org.apache.whatever.package</type>grep, awk 또는 sed를 사용하여 검색어와 가장 가까운(또는 동일한 섹션에 포함된) 검색어를 찾으세요.

답변1

첫째, XML에서 줄 번호를 찾는 것이 약간 이상하다는 것을 알았습니다. XML은 공백이 관련이 없는 트리 구조이므로 줄 번호도 관련이 없습니다. 이게 맞는지 궁금해지네요XY 문제.

둘째, 줄 번호 문제를 무시한다면 일반적으로 적절한 XML 파서나 XPATH 쿼리를 수행할 수 있는 것을 사용하는 것이 더 좋습니다. XML 측면에서 귀하의 질문은 "X 유형 노드의 키는 무엇입니까?"에 더 가깝습니다. 이는 XML로 작업할 때 타당하고 잘 정의된 질문입니다.

즉, "가장 가까운"이 <key>항상 먼저 나온 다면 <type>awk에서 이 알고리즘을 고려할 수 있습니다.

  • 행이 일치하면 <key>key-im-looking-for<행 번호를 기록하십시오.
  • 행이 일치하면 <type>org.apache.whatever.package<처리를 중지합니다.
  • 마지막으로 인쇄된 레코드의 줄 번호

이 같은:

awk '/<key>key-im-looking-for</ { line=NR }
     /<type>org.apache.whatever.package</ { exit }
     END { print line }' input.xml

답변2

이는 다음 명령을 사용하여 가능합니다:

cat -n sample.xml | grep key-im-looking-for
# or
grep -n key-im-looking-for sample.xml

관련 정보