나는 많은 .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
. 다른 모든 줄은 d
in !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>