나는 마지막 줄에 줄 바꿈이 없을 수 있는 파일에서 줄을 올바르게 읽는 방법에 대해 연구하고 있습니다. 이미 답을 찾았습니다개행 문자로 끝나지 않는 줄 지향 파일 읽기.
그러나 두 번째 목표는 줄 시작 부분의 주석을 제외하는 것이었습니다.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