내 입력이 같다 : I가 start .. end
블록 (... 또는 제 또는 제) 제를 추출 할패턴에 의해 제 n 범위 얻기
start
content A
end
garbage
start
content B
end
.
sed -ne '/start/,/end/p'
나는 가비지를 걸러 낼 수 있지만 "시작 콘텐츠 B 끝"은 어떻게 만듭니 까?
내 입력이 같다 : I가 start .. end
블록 (... 또는 제 또는 제) 제를 추출 할패턴에 의해 제 n 범위 얻기
start
content A
end
garbage
start
content B
end
.
sed -ne '/start/,/end/p'
나는 가비지를 걸러 낼 수 있지만 "시작 콘텐츠 B 끝"은 어떻게 만듭니 까?
그러나 얻을 두번째 범위를 가져 오기 - 당신이 얻을 sed :)
/^start$/{
x
s/^/a/
/^aaa$/{
x
:loop
p
/^end$/q
n
bloop
}
x
}
가운데 일치 항목의 a 수는 원하는 세그먼트 수와 같습니다. 데니스 (Dennis)가 지적한 바와 같이 정규 표현식을 반복 할 수도 있습니다. 이 방법을 사용하면 스크립트에 직접 번호를 지정할 수 있습니다.
참고 : 스크립트는 -n
sed
옵션으로 실행해야합니다.
+1 길이 * n * :'/^a \ {3 \} $/{'길이의 문자 시퀀스 대신 * n *에 실제 숫자를 사용할 수 있습니다. 스크립트는'sed -n' 명령으로 실행되어야합니다. –
모든 범위
$ 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
다른 방법으로, 전통적으로 : awk/start/{C++} c == n &&/start /,/end/'' –
블록 마커를 포함 시키려면 'FS $ NF RS 인쇄'를 할 수 있습니다. 산출. –
@Dennis, 감사합니다. 나는 그 요구 사항을 놓쳤다. – kurumi
왜'sed'입니까? 효율성의 이유로? 'awk '를 사용하면 속도가 느려지므로 스크립트는이 경우에 더 쉽게 사용할 수 있습니다. –
"느린"댓글에 동의하지 않습니다. – kurumi
@pooh 맞습니다. awk도 좋습니다. – phihag