이것들은 명백히 비밀스러운 sed
명령입니다. 구체적으로 (에서 man sed
) :
: label
b 및 t 명령의 레이블입니다.
t label
마지막 입력 행을 읽은 후 마지막 t 또는 T 명령 이후 as ///가 성공적으로 대체 된 경우 label to branch; label을 생략하면 스크립트 끝에서 분기합니다.
n N 다음 입력 라인을 패턴 공간으로 읽거나 추가합니다.
따라서 게시 한 스크립트는 (가독성을 위해 추가 된 공백)으로 나눌 수 있습니다.
sed ':a; $!N; s/\n/string/; ta'
--- ---- ------------- --
| | | |--> go back (`t`) to `a`
| | |-------------> substitute newlines with `string`
| |----------------------> If this is not the last line (`$!`), append the
| next line to the pattern space.
|----------------------------> Create the label `a`.
기본적 으로이 작업은 의사 코드로 다음과 같이 작성할 수 있습니다.
while (not end of line){
append current line to this one and replace \n with 'string'
}
좀 더 복잡한 입력 예제를 사용하면 이것을 더 잘 이해할 수 있습니다.
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
왜 !$
필요한지 잘 모르겠습니다 . 내가 알 수있는 한, 동일한 출력을 얻을 수 있습니다.
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'