2011-02-16 3 views
0

내 입력이 같다 : I가 start .. end 블록 (... 또는 제 또는 제) 제를 추출 할패턴에 의해 제 n 범위 얻기

start 
content A 
end 
garbage 
start 
content B 
end 

.

sed -ne '/start/,/end/p' 

나는 가비지를 걸러 낼 수 있지만 "시작 콘텐츠 B 끝"은 어떻게 만듭니 까?

+0

왜'sed'입니까? 효율성의 이유로? 'awk '를 사용하면 속도가 느려지므로 스크립트는이 경우에 더 쉽게 사용할 수 있습니다. –

+0

"느린"댓글에 동의하지 않습니다. – kurumi

+0

@pooh 맞습니다. awk도 좋습니다. – phihag

답변

2

그러나 얻을 두번째 범위를 가져 오기 - 당신이 얻을 sed :)

/^start$/{ 
    x 
    s/^/a/ 
    /^aaa$/{ 
    x 
    :loop 
    p 
    /^end$/q 
    n 
    bloop 
    } 
    x 
} 

가운데 일치 항목의 a 수는 원하는 세그먼트 수와 같습니다. 데니스 (Dennis)가 지적한 바와 같이 정규 표현식을 반복 할 수도 있습니다. 이 방법을 사용하면 스크립트에 직접 번호를 지정할 수 있습니다.

참고 : 스크립트는 -nsed 옵션으로 실행해야합니다.

+1

+1 길이 * n * :'/^a \ {3 \} $/{'길이의 문자 시퀀스 대신 * n *에 실제 숫자를 사용할 수 있습니다. 스크립트는'sed -n' 명령으로 실행되어야합니다. –

1

모든 범위

$ awk 'BEGIN{RS="end";FS="start"}{ print $NF}' file 

content A 


content B 

당신이 나오지 원하는 경우, 어쨌든

$ awk 'BEGIN{RS="end";FS="start"}{c++; if (c==2) print $NF}' file 

content B 

루비 (1.9+), 최초의 범위를

$ ruby -0777 -ne 'puts $_.scan(/start(.*?)end/m)[0]' file 

content A 
+0

다른 방법으로, 전통적으로 : awk/start/{C++} c == n &&/start /,/end/'' –

+0

블록 마커를 포함 시키려면 'FS $ NF RS 인쇄'를 할 수 있습니다. 산출. –

+0

@Dennis, 감사합니다. 나는 그 요구 사항을 놓쳤다. – kurumi