tr을 사용하여 이중 새 줄을 단일 줄로 바꾸는 방법은 무엇입니까?

tr을 사용하여 이중 새 줄을 단일 줄로 바꾸는 방법은 무엇입니까?

문자가 주어졌을 때,

$ 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-> cb-> d. 문자가 나타나는 순서나 누락된 문자가 있는지 여부는 중요하지 않습니다. 따라서 다음과 같습니다.

$ echo "a b bba" | tr ab cd
c d ddc

두 번째 목록이 더 짧은 경우 마지막 문자를 반복하여 첫 번째 목록의 길이까지 확장합니다. 따라서 , , 중 하나를 tr abc d변경 하거나 개행을 개행으로 변경하면 아무 일도 일어나지 않습니다.abcdtr '\n\n' '\n'

$ echo "a b bcba" | tr abc d
d d dddd

즉, replacement 후에 선택적으로 동일한 문자를 사용할 수 있으므로 -s개행 문자를 개행 문자로 바꾼 다음 한 줄에 하나의 개행 문자만 유지할 수 있습니다.squeezetr -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

관련 정보