문자가 주어졌을 때,
$ cat a.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at magna sed libero accumsan ultrices. Proin varius tortor risus, at pulvinar quam auctor
vitae.
Etiam iaculis ipsum quis lacus convallis finibus. Nunc fermentum, nunc sit amet egestas congue, odio quam sollicitudin velit, quis venenatis augue
nibh sed tortor.
이 명령을 사용하면 이중 공백 줄을 제거할 수 없습니다.
$ tr '\n\n' '\n' < a.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at magna sed libero accumsan ultrices. Proin varius tortor risus, at pulvinar quam auctor
vitae.
Etiam iaculis ipsum quis lacus convallis finibus. Nunc fermentum, nunc sit amet egestas congue, odio quam sollicitudin velit, quis venenatis augue
nibh sed tortor.
하나의 새 줄을 다른 문자로 바꾸는 것이 이상하지 않습니까?
답변1
tr
한 번에 한 문자만 보므로 tr ab cd
변경 사항을 알려주십시오 a
-> c
및 b
-> d
. 문자가 나타나는 순서나 누락된 문자가 있는지 여부는 중요하지 않습니다. 따라서 다음과 같습니다.
$ echo "a b bba" | tr ab cd
c d ddc
두 번째 목록이 더 짧은 경우 마지막 문자를 반복하여 첫 번째 목록의 길이까지 확장합니다. 따라서 , , 중 하나를 tr abc d
변경 하거나 개행을 개행으로 변경하면 아무 일도 일어나지 않습니다.a
b
c
d
tr '\n\n' '\n'
$ echo "a b bcba" | tr abc d
d d dddd
즉, replacement 후에 선택적으로 동일한 문자를 사용할 수 있으므로 -s
개행 문자를 개행 문자로 바꾼 다음 한 줄에 하나의 개행 문자만 유지할 수 있습니다.squeeze
tr -s '\n' '\n'
$ cat test.txt
foo
bar
doo
$ cat test.txt | tr -s '\n' '\n'
foo
bar
doo
귀하의 예에는 두 개의 빈 줄이 있으므로삼연속 줄 바꿈. 줄 바꿈을 제거하여 빈 줄이 하나만 있도록 하려면(둘줄바꿈)이 단락 사이에 남아 있으면 사용할 수 없을 것 같습니다 tr
. 하지만 예를 들어 awk
. 위에서 test.txt
:
$ awk '/./ { e=0 } /^$/ { e += 1 } e <= 1' < test.txt
foo
bar
doo