명령 sed '1!G;h;$!d' 파일 내용을 어떻게 되돌리나요?

명령 sed '1!G;h;$!d' 파일 내용을 어떻게 되돌리나요?

sed내 질문은 다음에 제공된 특정 솔루션과 관련이 있습니다.이 답변이 질문에 대하여역방향 쿼리. 내가 해독할 수 없는 점 sed/해결책 grep은 다음과 같습니다.

sed '1!G;h;$!d' file

이 명령을 해독할 수 있는 사람이 있나요?

내 VI(M) 지식을 통해 G는 파일의 마지막 줄을 의미하고 sed에서 bang(!) 뒤에는 다음과 같은 주소가 나오는 것을 알고 있습니다. 이는 grep -v해당 줄과 일치하지 않음을 의미합니다. 그러나 전체적으로 위의 인라인 sed 스크립트는 내 범위를 벗어납니다.

답변1

이렇게 하면 파일이 한 줄씩 반전됩니다.

sed '1!G;h;$!d'문서

sed첫째 ,예비 공간그리고패턴 공간. 특정 명령에 초점을 맞추기 전에 먼저 두 명령을 구별해야 합니다.

새 줄을 읽으면 sed패턴 공간에 로드됩니다. 따라서 새 줄이 처리될 때마다 해당 공간을 덮어쓰게 됩니다. 반면에 예약된 공간은 처리 전반에 걸쳐 일관되며 나중에 사용하기 위해 값을 저장할 수 있습니다.


명령에 :

1!G이 명령문에는 , h및 3개의 명령이 있습니다.$!d

  • 1!GG이는 명령이 첫 번째 줄(음수 !) 을 제외한 모든 줄에서 실행된다는 의미입니다 1. G인용하다추가의예약된 공간의 내용을 패턴 공간에 넣습니다.

  • h모든 행에 적용됩니다. 그것복사공간을 예약된 공간으로 패턴화하고 덮어씁니다.

  • $!d마지막 줄을 제외한 모든 줄에 적용됩니다( $마지막 줄을 의미하며 !이를 무효화함). d라인(패턴 공간)을 뚫고 지나가라는 명령입니다.


  1. 이제 첫 번째 줄을 읽으면 명령이 sed실행됩니다 h. 첫 번째 행은 예약된 공간에 복사됩니다. 그런 다음 $!기준을 충족했기 때문에 제거되었습니다 . sed두 번째 줄로 계속하세요.
  2. 두 번째 줄은 조건과 일치하므로 1!(첫 번째 줄이 아님) 예약된 공간(첫 번째 줄이 있음)이 패턴 공간(두 번째 줄이 있음)에 추가됩니다. 그 후, 패턴 공간에는 이제 두 번째 줄이 있고 그 뒤에 첫 번째 줄이 있으며 개행 문자로 구분됩니다. 이제 h명령이 적용됩니다(모든 행에서와 같이). 패턴 공간의 모든 내용이 예약된 공간에 복사됩니다. 세 번째 설명( $!d)이 적용됩니다. 행이 패턴 공간에서 제거됩니다.
  3. 이제 모든 라인이 2단계를 완료했습니다. 마지막 줄로 넘어가겠습니다.
  4. 마지막 줄( $)에서는 삭제 부분( d)을 제외하고 2단계가 거의 모두 완료되었습니다. sed, 없이 호출되면 -n각 입력 라인의 처리가 끝날 때 패턴 공간을 자동으로 인쇄합니다. 따라서 삭제하지 않으면 패턴 공간이 인쇄됩니다. 이제 다음의 모든 행이 포함됩니다.역순으로.

관련 정보