2012-10-23 2 views
8

저는 스크립팅을 처음 사용하고 두 가지 패턴 사이에 존재하는 텍스트를 추출하는 방법을 배우려고했습니다.sed/awk - 여러 줄에 걸쳐있는 패턴 사이에 텍스트 인쇄

입력 파일 독서가있는 경우 :

Hi I would like 
to print text 
between these 
patterns 

내 예상 출력을은 그러나, 나는 여전히 다음과 같은 시나리오에서 두 패턴 사이에 텍스트를 추출하는 방법을 알아낼 수 없습니다입니다 같은 :

내 첫 번째 검색 패턴 즉
I would like 
to print text 
between these 

는 "안녕 '이 패턴을 건너 뛸 수 있지만, 일치하는 패턴을 다음과 같은 라인에있는 모든 인쇄 내 두 번째 공학자이다. h 패턴은 "패턴"이며,이 라인이나 그 이상의 모든 라인을 인쇄하는 것을 완전히 피하고 싶습니다.

sed -n '/Hi/,/patterns/p' test.txt 

Hi I would like 
to print text 
between these 
patterns 

다음 I 시도 [출력] :

`awk ' /'"Hi"'/ {flag=1;next} /'"pattern"'/{flag=0} flag { print }'` test.txt 

[출력]

to print text 
between these 

난 다음 시도

누군가가이를 달성하는 방법을 찾는데 나를 도울 수 있습니까? 사전

답변

6

을하지만, 다음에 따라 일부 약간의 개조가 필요합니다 성적 증명서 :

pax> echo 'Hi I would like 
to print text 
between these 
patterns ' | awk ' 
    /patterns/ { echo = 0 } 
    /Hi/ { gsub("^.*Hi ", "", $0); echo = 1 } 
       { if (echo == 1) { print } }' 

또는 압축 된 형태 :

awk '/patterns/{e=0}/Hi /{gsub("^.*Hi ","",$0);e=1}{if(e==1){print}}' 
,536,

출력은 다음과 같습니다 :

I would like 
to print text 
between these 

요청시.

이 작동 방식은 다음과 같습니다. echo 변수는 처음에는 0이며 에코가 발생하지 않습니다.

각 행을 차례로 확인합니다. patterns이 있으면 에코가 사용되지 않습니다.

Hi 메아리가 켜져 있고gsubHi까지 모든 것을 없애 줄을 수정하는 데 사용됩니다, 다음에 공백이 포함 된 경우.

그렇다면 echo 플래그가 켜져 있으면 해당 줄 (변경 가능)이 에코됩니다.

지금과 같은 에지 경우가있을거야 :

    Hi의 두 가지 항목을 포함
  • 라인; 또는
  • 앞에 앞에 patterns이 포함 된 행.

처리 방법을 지정하지 않았으므로 귀찮게하지 않았지만 기본 개념은 동일해야합니다.

+0

답장과 상세한 설명 paxdiablo, 당신의 soln을위한 감사합니다. 매력처럼 작동합니다 :-). 필자의 경우, 같은 줄에 패턴 단어가 반복적으로 나타나거나 "패턴"이전에 단어가 나오지 않는다. 필자의 시나리오에서는 항상 모든 것을 버리고 싶은 줄 시작을 식별 할 수 있으며이 줄은 항상 같은 패턴으로 시작됩니다. 응답을 위해 다시 한번 감사드립니다 .-) –

+0

몇 가지 문제 : 1) "^. * Hi"는 RE에서 "Hi"와 동일합니다. 2) 세 번째 인수로 $ 0을 지정할 필요가 없습니다. * sub(), 3) gsub()은 하나의 어커런스 만 바꾸고 싶을 때 필요하지 않습니다. 4) "{if (echo == 1) {print}}"는 "echo" 그것은 자신의 것입니다. –

+0

Ed. Re 1, 아니, 그렇지 않을 때, 당신이 대체 할 때가 아닙니다. 차이점은 바로 hi 또는 라인을 포함하여 hi까지 포함하는 것입니다. 대부분은 문체이지만 다른 점도 유효합니다. – paxdiablo

3

에서 덕분에 라인 "패턴"제거 솔루션을 업데이트 : 당신은 awk에 올바른 생각, 미니 상태 기계가

$ sed -n '/^Hi/,/patterns/{s/^Hi //;/^patterns/d;p;}' file 
I would like 
to print text 
between these 
+0

감사 전문가는, 완전하게 작동한다! :-) –

2

이 당신을 위해 작동 할 수 있습니다 (GNU 나오지도) : 당신이 패턴을 발견 할 때 (F)는 + 찾을 때 행의 시작에 안녕을 대체 분명이, 다음 호출

sed '/Hi /!d;s//\n/;s/.*\n//;ta;:a;s/patterns.*$//;tb;$!{n;ba};:b;/^$/d' file 
1

그냥 플래그를 설정 깃발이 놓일 때 디폴트 인쇄 :

$ awk 'sub(/^Hi /,""){f=1} /patterns/{f=0} f' file 
I would like 
to print text 
between these 
관련 문제