给定一个文本,
$ 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
to中的任何一个d
并将tr '\n\n' '\n'
换行符更改为换行符,这不会执行任何操作。
$ echo "a b bcba" | tr abc d
d d dddd
也就是说,可以选择在替换后-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