GNU sed 범위 주소 작동 방식 이해

GNU sed 범위 주소 작동 방식 이해

내가 읽고 있는 내용은범위 주소GNU sed에서. 그러나 그것이 정확히 어떻게 작동하는지 이해하지 못합니다. 실행을 시도했지만 sed --debug출력이 너무 장황하여 이해할 수 없습니다.

다음과 같은 파일이 있다고 가정해 보겠습니다 input.txt.

===sep1

Aghroum

===sep2
Thirjeen
===sep3
Ya wedi mata ikinikh

===sep4
Ifoullissen
===sep5

다음과 같이 범위 주소를 사용하려고 하면:

sed -n '/=/,/=/{/=\|^$/! p}' input.txt

출력은 다음과 같습니다

# it prints non-empty lines from ===sep1 to ==sep2, and from ===sep3 to ==sep4, etc. 
Aghroum
Ya wedi mata ikinikh

내가 아는 한, GNU sed는 입력 파일을 한 줄씩 처리하는데 왜 둘 중 하나도 일치하지 않습니까?범위 주소사이에 ==sep2? ==sep3(행을 얻는 방법을 묻는 것이 아니라 그런 것을 사용하여 수행하는 방법을 알고 있습니다 . 하지만 왜 두 번째 범위 주소에서 시작 sed -n '/===/!p'하지 않는지 묻고 있습니다 .)===sep2===sep3

감사해요

답변1

이 동작에 대한 설명은 다음에서 찾을 수 있습니다.sedPOSIX 사양:

두 개의 주소가 있는 편집 명령은 첫 번째 주소와 일치하는 첫 번째 패턴 공간부터 두 번째 주소와 일치하는 다음 패턴 공간까지 포함 범위를 선택해야 합니다. [...] 선택한 범위 다음의 첫 번째 행부터 시작하여,sed첫 번째 주소가 다시 검색됩니다. 그런 다음 이 과정을 반복해야 합니다.

범위를 찾으면 다음 범위는 해당 줄에서만 시작할 수 있습니다.다음과 같은가장 빠른 범위.

즉, 범위 내의 끝 일치는 일치하는 행을 "소비"합니다. 해당 행은 동일한 범위의 다른 인스턴스를 시작할 수 없습니다.

답변2

sed요청한 대로 수행하고 명령에 지정된 대로 from =과 일치합니다.=

sed -n '/=/,/=/{/=\|^$/! p}' input.txt

sed한 번에 각 줄을 읽으십시오. 즉, 범위의 끝이 발견되면 해당 끝 범위도 시작 범위로 포함되지 않습니다.

이걸 고려하세요;

===sep1

Aghroum

===sep2

Aghroum범위 일치 및 파일 끝에 도달했기 때문에 범위는 항상 일치합니다 .

파일의 나머지 부분을 포함합니다.

Thirjeen
===sep3
Ya wedi mata ikinikh

===sep4
Ifoullissen
===sep5

일치가 다시 시작됩니다. 이번에는 값이 있는 줄부터 시작하여 sep03범위의 다음 일치 항목이 =출력됩니다 Ya wedi mata ikinikh.

이후 일치하는 항목이 하나만 있고 범위가 종료되지 않으므로 해당 범위에 다른 일치 항목이 없으므로 일치 항목이 종료됩니다.

관련 정보