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つの新しい行を別の文字に置き換えるのは奇妙ではありませんか?

答え1

tr一度に1文字しか表示されないため、tr ab cd変更内容を教えてくださいa- >cb- > d。文字が表示される順序や欠落文字があるかどうかは問題ではありません。したがって、次のようになります。

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

2番目のリストが短い場合は、最後の文字を繰り返して最初のリストの長さまで拡張します。したがって、、のいずれかをtr abc d変更したり改行を改行に変更すると何も起こりません。abcdtr '\n\n' '\n'

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

つまり、再配置後にオプションで同じ文字を使用できるため、改行文字を改行文字に-s置き換えてから、1行に1つの改行文字しか保持できません。squeezetr -s '\n' '\n'

$ cat test.txt
foo


bar

doo
$ cat test.txt  | tr -s '\n' '\n'
foo
bar
doo

あなたの例には2つの空行があるのでサム連続改行。改行を削除して空の行を1つだけにするには(二つ改行)が段落の間に残っていると使用できないようですtr。しかし、例えばawk。上からtest.txt

$ awk '/./ { e=0 } /^$/ { e += 1 } e <= 1' < test.txt  
foo

bar

doo

関連情報