이 sed는 "$a\" 스크립트에 대해 무엇을 합니까?

이 sed는 "$a\" 스크립트에 대해 무엇을 합니까?

이 sed 명령을 발견했지만 그것이 무엇을 하고 있는지 전혀 모릅니다. 내부 변경 파일을 사용하고 있다는 것을 알고 있습니다 -i. 스크립트를 사용하고 있으며 -e스크립트는 입니다 $a\. 하지만 이 스크립트는 무엇을 하고 있나요?

sed -i -e '$a\' filename

답변1

다른 사람들이 말했듯이,예를 들어존재하다파일 끝에 개행 문자를 추가하는 방법은 무엇입니까?, GNU sed(및 기타 구현) 의 $a\경우 파일 끝에 개행 문자가 없으면 파일 끝에 개행 문자를 추가합니다.

그것이 무엇을 하는지는 매우 명확하지 않으며 문서에서도 이에 대해 설명하지 않습니다. 하지만 소스코드를 확인해보면...

문서부터 시작해 보겠습니다. $a\예 변형 a, 특수 사례 활용GNU 확장:

GNU 확장으로서 a다음 명령과텍스트-e보다 쉬운 스크립팅을 위해 두 개의 매개변수로 분할할 수 있습니다 .

$ seq 3 | sed -e '2a\' -e hello
1
2
hello
3

$ sed -e '2a\' -e "$VAR"

a이 메소드는 sed추가할 텍스트 큐를 사용하여 구현되며, append_queue큐를 처리해야 할 경우이름이 사람dump_append_queue, 첫 번째 단계는

output_missing_newline (&output_file);

필요한 경우 누락된 줄 바꿈을 추가합니다. 추가된 텍스트가~ 할 것이다현재 줄의 끝이 아닌 별도의 줄에 추가합니다. 그런 다음 대기열의 내용을 추가합니다.

를 사용하면 sed -i '$a\'필요한 경우 누락된 줄바꿈이 추가되고 대기열이 처리됩니다. 그러나 대기열이 비어 있으므로 다른 변경 사항은 적용되지 않습니다.

답변2

마지막 줄이 없으면 마지막 줄에 개행 문자가 추가됩니다.

줄 바꿈 없이 파일 만들기

$ printf 'line1\nline2' > file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2
0000013

sed가 무엇을 하는지 봅시다:

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014

다시 실행하면 어떻게 되나요? 추가할지 여부다른새로운 팀?

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014

아니요.

관련 정보