이 sed 명령이 모든 줄을 인쇄하는 이유는 무엇입니까?

이 sed 명령이 모든 줄을 인쇄하는 이유는 무엇입니까?

이 sed 명령은 왜 sed /^a/,/i$/p "a"로 시작하고 "i"로 끝나는 줄뿐만 아니라 모든 줄을 인쇄합니까? 그게 어떻게 작동하는지 잘 모르겠습니다 sed /BEGIN/,/END/p.

표준 입력:

arthuri
John
Johnny
Michael 

표준 출력:

arthuri
arthuri
John
John
Johnny
Johnny
Michael
Michael

답변1

sed기본적으로 d패턴 공간은 명령이 호출되지 않는 한 각 주기가 끝날 때 인쇄됩니다.

이 기능은 이 옵션을 사용하거나 -n스크립트의 첫 번째 줄을 다음으로 설정하여 비활성화할 수 있습니다.sed#n

sed따라서 여기서는 기본적으로 인쇄 하는 것 외에도반품a첫 번째 줄로 시작하고 끝나는 줄로 시작하는 패턴 공간을 인쇄합니다.이후로 끝납니다 i.

입력의 첫 번째 줄은 arthuri( ) 로 시작 a하지만 그 끝 이후에는 줄이 없으므로 i범위는 /^a/,/i$/끝나지 않고 모든 줄이 인쇄됩니다(기본적으로 끝에 두 번 인쇄되기 때문에).

sed범위에는 항상 최소 2줄이 포함됩니다(입력의 마지막 줄에서 시작하는 특별한 경우는 제외).

시작 줄과 끝 줄이 동일하도록 하려면( 로 시작하고 끝나는 경우와 마찬가지로 arthuri) 다음을 사용할 수 있습니다.aiawk

awk '/^a/, /i$/'

또는 perl:

perl -ne 'print if /^a/ .. /i$/'

a로 시작하고 끝나는 줄을 인쇄하려면 i주소 범위를 사용하지 말고 다음을 따르세요.

sed '/^a/!d; /i$/!d'

또는:

sed '/^a.*i$/!d'

또는:

sed -n '/^a.*i$/p'

여기에서는 다음을 사용할 수도 있습니다 grep.

grep -x 'a.*i'

^, *및 는 $많은 쉘 구문에서 특수 문자입니다. 일반적으로 sed코드 매개변수를 인용하려고 합니다 .

관련 정보