이스케이프 문자가 포함된 두 문자열 사이의 내용 인쇄(Linux/Bash)

이스케이프 문자가 포함된 두 문자열 사이의 내용 인쇄(Linux/Bash)

나는 많은 .app 파일에서 내 서버를 검색하고 두 문자열 사이에 있는 내용을 출력하는 스크립트를 작성하려고 합니다. 두 문자열 사이에 발생한 내용만 출력합니다. AWK 및 GREP을 사용하여 이 작업을 수행할 수 있지만 검색해야 하는 용어에 이스케이프 문자가 있으므로 작동하지 않습니다.

다음은 .dat 파일에서 발췌한 내용입니다.

   <List Variable name="lookups">
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >             
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >         
  </Variable>
  <List Variable name="lookups_for_data">
      <Value>
        <Value name="lookups" value="LSM_OPT"/>
  </Variable>

'List Variable name="lookups"'와 '/Variable' 사이의 모든 데이터를 찾아야 하며 다른 것은 없습니다... 문제의 일부는 이스케이프 문자이지만 .dat 파일에 다른 항목도 있습니다. 캡처하고 싶지는 않지만 원래 검색 값과 위의 "목록 변수 이름="lookups_for_data""와 같은 추가 데이터가 포함되어 있습니다. 그런 것은 원하지 않습니다.

여러 awk 및 sed 옵션을 시도했지만 문제는 이스케이프 문자라고 생각합니다. 어떤 도움이라도 대단히 감사하겠습니다! 당신의 도움을 주셔서 감사합니다! !

답변1

듣기만 해도 파일에서 다음 두 토큰 문자열 사이에 나타나는 모든 항목을 찾고 싶을 것입니다.

<List Variable name="lookups">
   ...
   ...
</Variable>

이렇게 하려면 다음 sed명령을 사용할 수 있습니다.

$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d;//d' file.dat
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >

이렇게 하면 사이에 있는 모든 줄이 인쇄되지만 2개의 표시 줄은 무시됩니다.

어떻게 작동하나요?

위의 코드는 시작 패턴과 일치하는 줄을 찾은 <List Variable name="lookups">다음 두 번째 일치하는 줄을 만날 때까지 모든 줄을 찾습니다 <\/Variable>. 이들 사이에 있는 행은 sed삭제되지 않습니다 !d. 다른 모든 줄은 din !d으로 삭제됩니다. 두 번째는 //d표시된 줄을 삭제합니다.

위 작업을 수행하고 마커 라인을 인쇄하려면 위 sed명령을 다음과 같이 변경할 수 있습니다.

$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d' file.dat
   <List Variable name="lookups">
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >
  </Variable>

관련 정보