如何使用 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将更改abcto中的任何一个d并将tr '\n\n' '\n'换行符更改为换行符,这不会执行任何操作。

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

也就是说,可以选择在替换后-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

相关内容