Replace
如何使用 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.
用其他 char 作品替換單個新行,是不是很奇怪?
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 -d '\n' '\n'
可以用換行符替換換行符,然後在一行中只留下一個換行符:$ cat test.txt foo bar doo $ cat test.txt | tr -s '\n' '\n' foo bar doo
請注意,在您的範例中,您有兩個空行,因此連續三個換行符。如果您想刪除換行符,以便段落之間只剩下一個空行(兩個換行符),那麼我認為您不能使用
tr
. 但是你可以使用 egawk
。從test.txt
上面:$ awk '/./ { e=0 } /^$/ { e += 1 } e <= 1' < test.txt foo bar doo