내 질문은 관련이 sed
주어진 – 특정 솔루션 이 답변 이 질문에 대한 역 grepping . sed
/의 grep
내가 해독 할 수없는 오전 솔루션은 하나를 다음입니다 :
sed '1!G;h;$!d' file
누군가이 명령을 해독 할 수 있습니까?
나는 VI (M) 지식에서 G가 파일의 마지막 줄을 나타내고 sed에서 bang (!) 다음에 주소 작업이 grep -v
그 줄과 일치하지 않는다고 말하는 것을 알고 있습니다. 그러나 전체적으로 위의 인라인 sed 스크립트는 저쪽에 있습니다.
답변
파일을 한 줄씩 뒤집습니다.
sed '1! G; h; $! d' 파일
첫째, sed
이 보류 영역 과 패턴 공간을 . 특정 명령에 집중하기 전에 이들을 구별해야합니다.
때 sed
새 줄을 읽고, 그것은 패턴 공간에로드됩니다. 따라서 새 줄을 처리 할 때마다 해당 공간을 덮어 씁니다. 반면에, 홀드 공간은 전체 처리에서 일관되며 나중에 사용하기 위해 값을 저장할 수 있습니다.
명령으로 :
이이 문에서 3 개 명령은 다음과 같습니다 1!G
, h
그리고$!d
-
1!G
는G
명령이 첫 번째 행을 제외한 모든 행에서 실행 됨을 의미합니다 (를!
무시합니다1
). 홀드 공간에있는 것을 패턴 공간G
에 추가 하는 것을 의미 합니다. -
h
모든 라인에 적용됩니다. 그것은 복사 패턴 홀드 공간에 공간 (및 덮어 쓰기를). -
$!d
마지막 줄을 제외한 모든 줄에 적용됩니다 ($
마지막 줄을 나타내며!
무시합니다).d
행을 삭제하는 명령입니다 (패턴 공간).
- 이제 첫 번째 줄을 읽을
sed
때h
명령을 실행하십시오 . 첫 번째 줄이 보류 공간에 복사됩니다. 그런 다음$!
조건 과 일치하므로 삭제됩니다 .sed
두 번째 줄을 계속합니다. - 두 번째 줄은 조건
1!
(첫 번째 줄이 아님) 과 일치 하므로 보류 공간 (첫 번째 줄이 있음)이 패턴 공간 (두 번째 줄이 있음)에 추가됩니다. 그 후, 패턴 공간에는 두 번째 줄 다음에 첫 번째 줄이 있으며 줄 바꿈으로 구분됩니다. 이제h
명령이 적용됩니다 (모든 행에서와 같이). 패턴 공간에있는 모든 것이 보류 공간에 복사됩니다. 세 번째 문장 ($!d
)이 적용됩니다. 행이 패턴 공간에서 삭제됩니다. - 2 단계는 이제 모든 회선으로 수행됩니다. 마지막 줄로 건너 뜁니다.
- 마지막 줄 (
$
)에서 거의 모든 2 단계가 완료되지만 삭제 부분 (d
) 은 수행되지 않습니다 .sed
로 호출하지 않으면-n
각 입력 행에 대한 처리가 끝날 때 패턴 공간을 자동으로 인쇄합니다. 따라서 삭제하지 않으면 패턴 공간이 인쇄됩니다. 이제 모든 줄을 역순으로 포함합니다 .