Grep 명령의 부작용은 파일의 마지막 줄에 후행 개행 문자를 추가하는 것입니다.

Grep 명령의 부작용은 파일의 마지막 줄에 후행 개행 문자를 추가하는 것입니다.

나는 마지막 줄에 줄 바꿈이 없을 수 있는 파일에서 줄을 올바르게 읽는 방법에 대해 연구하고 있습니다. 이미 답을 찾았습니다개행 문자로 끝나지 않는 줄 지향 파일 읽기.

그러나 두 번째 목표는 줄 시작 부분의 주석을 제외하는 것이었습니다.grep목표를 달성하기 위한 명령

$ grep -v '^ *#' file

그러나 나는 이 명령에 (나에게는 예상치 못한) 부작용이 있다는 것을 알았습니다. 존재하지 않는 경우 마지막 줄에 후행 개행 문자를 추가합니다.

$ cat file
# This is a commentary
aaaaaa
# This is another commentary
bbbbbb
cccccc

$ od -c file
0000000   #       T   h   i   s       i   s       a       c   o   m   m
0000020   e   n   t   a   r   y  \n   a   a   a   a   a   a  \n   #
0000040   T   h   i   s       i   s       a   n   o   t   h   e   r
0000060   c   o   m   m   e   n   t   a   r   y  \n   b   b   b   b   b
0000100   b  \n   c   c   c   c   c   c  \n
0000111

$ truncate -s -1 file

$ od -c file
0000000   #       T   h   i   s       i   s       a       c   o   m   m
0000020   e   n   t   a   r   y  \n   a   a   a   a   a   a  \n   #
0000040   T   h   i   s       i   s       a   n   o   t   h   e   r
0000060   c   o   m   m   e   n   t   a   r   y  \n   b   b   b   b   b
0000100   b  \n   c   c   c   c   c   c
0000110

$ od -c <(grep -v '^ *#' file)
0000000   a   a   a   a   a   a  \n   b   b   b   b   b   b  \n   c   c
0000020   c   c   c   c  \n
0000025

줄 시작 주석을 제거하는 것 외에도 마지막 줄에 후행 개행 문자도 추가합니다.

그게 어떻게 가능하지?

답변1

POSIX 사양지적

A line is a sequence of zero or more non-<newline> characters plus a terminating
<newline> character.

해당 동작은 grep예상된 동작입니다. 누락된 후행 개행 문자를 추가합니다.incomplete line.

이 방법:

$ cat file
# This is a commentary
aaaaaa
# This is another commentary
bbbbbb
cccccc

$ od -c file
0000000   #       T   h   i   s       i   s       a       c   o   m   m
0000020   e   n   t   a   r   y  \n   a   a   a   a   a   a  \n   #
0000040   T   h   i   s       i   s       a   n   o   t   h   e   r
0000060   c   o   m   m   e   n   t   a   r   y  \n   b   b   b   b   b
0000100   b  \n   c   c   c   c   c   c  \n
0000111

$ truncate -s -1 file

$ od -c file
0000000   #       T   h   i   s       i   s       a       c   o   m   m
0000020   e   n   t   a   r   y  \n   a   a   a   a   a   a  \n   #
0000040   T   h   i   s       i   s       a   n   o   t   h   e   r
0000060   c   o   m   m   e   n   t   a   r   y  \n   b   b   b   b   b
0000100   b  \n   c   c   c   c   c   c
0000110

$ od -c <(grep '.' file)
0000000   #       T   h   i   s       i   s       a       c   o   m   m
0000020   e   n   t   a   r   y  \n   a   a   a   a   a   a  \n   #    
0000040   T   h   i   s       i   s       a   n   o   t   h   e   r    
0000060   c   o   m   m   e   n   t   a   r   y  \n   b   b   b   b   b
0000100   b  \n   c   c   c   c   c   c  \n
0000111

관련 정보