2016-09-07 3 views
2

두 문자열 사이를 인쇄하는 방법을 찾는 동안 길을 잃어 버렸습니다. 이 두 문자열에는 <,>과 같은 특수 문자가 포함됩니다.awk만을 사용하는 두 정규 표현식 사이에서 인쇄

sed을 완벽하게 사용할 수는 있지만 사용할 수는 없지만 결과에 대해 추가 텍스트 조작이 필요하므로 awk이 필요합니다. 내가 사이의 텍스트에 intrested입니다

$ cat input.txt 
RANDOM CLI> THIS IS BEFORE WINDOW 
RANDOM CLI> 
RANDOM CLI>log list all show... 
bla bla 
bla bla 
bla bla bal 
bla bla bla bla 
RANDOM CLI> 
RANDOM CLI> 
RANDOM CLI>THIS IS OUT OF WINDOW 

"RANDOM CLI> 로그 목록의 모든 쇼 ...""RANDOM CLI>"

이 : 여기

샘플 파일입니다 , 나오지도를 사용하여 네브라스카을 아래와 같이 할 수있다 :

$ sed -n '/CLI>log/,/ CLI>/p' cli 
RANDOM CLI>log list all show... 
bla bla 
bla bla 
bla bla bal 
bla bla bla bla 
RANDOM CLI> 

을하지만 언급으로, sed은 이타 아니다 내 요구 사항에 대 한 블 리와 awk 유일한 솔루션이 필요합니다.

일부 특수 문자는 이스케이프하지만 도움은되지 않습니다. 패턴 CLI> 단지 첫 번째 행 후 인쇄를 중지 AWK을 따라서뿐만 아니라 다양한 원인 시작에서 발견되기 때문에

awk '/CLI>log/,/ CLI>/' input.txt 
RANDOM CLI>log list all show... 

awk '/CLI\>log/,/CLI\>/' input.txt 

awk '/CLI>log/{f=1;for (i=0;i<=NR;i++){getline}}/CLI>/{f=0}f' cli 
+0

'<,>'문자에는 특별한 것이 없습니다. 첫 번째 awk 시도는 단어 경계로 바꿀 GNU awk 또는 GNU sed에서 이스케이프 처리하여'>' "special"을 만듭니다. awk을 더 잘 알기 전까지는 getline을 사용하지 마십시오. http://awk.freeshell.org/AllAboutGetline을 참조하십시오. –

+1

@ Edmonton 감사합니다. –

답변

4

기본 AWK 범위는 작동되지 않는다.

awk '/ CLI>log/,/ CLI>$/' input.txt 

RANDOM CLI>log list all show... 
bla bla 
bla bla 
bla bla bal 
bla bla bla bla 
RANDOM CLI> 

그렇지 않으면 당신은 또한 수있는 일 AWK 사용 :

awk 'p &&/CLI>/{print; p=0}/CLI>log/{p=1} p' input.txt 

이 명령은 인쇄 여부를 결정하는 토글 플래그 p를 사용

당신은 전체 범위를 인쇄 할 정규식을 고정 할 수 있습니다. pCLI>log을 줄 때 1으로 설정됩니다. 우리가 CLI> 텍스트를 얻을 때까지 계속 인쇄하고 p==1. 일단 우리가 그것을 얻으면 닫기 라인을 인쇄하고 p0으로 설정하여 인쇄를 중단합니다.

+0

안녕하세요 Anubhava, 고마워요. 왜 기본 awk 범위가 작동하지 않았는지 말해 줄 수 있습니까? 'awk '/ pat1 /,/pat2 /'file' 또한 해결책에 대한 설명이 있습니까? –

+1

범위에 대한 내 대답에 대한 설명이 추가되었습니다. 도움을 주신 덕분에 – anubhava

+1

. 솔루션에 설명을 추가하면 매우 유용합니다. –