sed의 'n' 명령을 이해하지 못합니다

sed의 'n' 명령을 이해하지 못합니다

나는 책을 읽고 있었고 다음을 실행할 때까지 명령을 sed & awk이해했다고 생각했습니다 .nsed

$ echo -ne "abc\ncde\nfg\n" | sed "/c/{
n
/f/d
}"

산출:

abc
cde
fg

하지만 나는 그 줄이 fg삭제될 것으로 예상했습니다.

프로세스에 대한 나의 이해:

  • c해당 줄과 일치하면 cde다음 줄도 일치하므로 fg명령으로 삭제해야 합니다 ./f/df

나는 명령을 이해하고 간단하다고 확신합니다. 특히 저자는 대문자 명령이 N,D,P더 어렵다고 썼기 때문에, 그것을 이해하면 어쨌든 소문자 명령도 이해할 수 있을 것입니다. 하지만 N명령에는 아무런 어려움이 없습니다 .

답변1

문제는 행이 fg패턴과 일치하지 않는다는 것입니다 /f/.

첫 번째 줄이 abc일치 하면 /c/블록 내의 명령이 실행됩니다.

  • n명령은 현재 패턴 공간을 인쇄 abc하고 패턴 공간을 다음 입력 줄로 바꿉니다 cde.

  • cde일치하는 항목이 없으면 삭제 /f/되지 않고 d표준 출력으로 인쇄됩니다.

이제 입력의 다음 줄을 읽고 fg일치하는 항목이 없으면 /c/코드 블록이 실행되지 않습니다.

look 명령을 사용하여 이를 확인할 수 있습니다 :

echo -ne "abc\ncde\nfg\n" | sed -n "l;/c/{
n
/f/d
}"

산출:

abc$
fg$

l스크립트 시작 부분에 ook 명령을 추가하면 코드 블록 외부에서 처리되는 입력 줄을 알 수 있습니다.

답변2

@don_crissti의 의견을 읽은 후 n명령이 sed.

n..."/c/{...다음 주기 분석에서 읽은(또는 다음) 행을 제외합니다. 따라서 n내 예에서 2번 사용 하면 abc일치하고 cde읽힌 다음 fg읽고 삭제됩니다.

$ echo -ne "abc\ncde\nfg\n" | sed "/c/{
n
n
/f/d
}"

산출:

abc
cde

관련 정보