作成者行に対して保持しながら、Fortune出力から強制改行を削除します。

作成者行に対して保持しながら、Fortune出力から強制改行を削除します。

最近、私はこの素晴らしいコマンドを見つけfortune、すぐにそれを使って継続的なチャットに毎晩引用を送りました。

今、強制改行を削除する方法を知りたいです。引用符しかし、保管してください。作成者行最後に。

なぜ?チャットウィンドウの幅が異なるため、ほとんどの場合、生成された出力は二重ラップされます。 (これはうまく表現されていませんが、おそらく私が意味するものをすでに理解しているはずです。そうでない場合は、これはあなたにとって重要です。自由にお問い合わせください。説明)。

もちろん、解決策を検索して次を見つけました。

echo -n `fortune`

しかし、これは明らかにすべての改行文字を削除します。

互換性のあるソリューションが最も高く評価されてshいますが、単純さが大幅に向上した場合bash(他の?)オプションも可能です。


2016年2月12日に更新されました:

要求に応じて複数行の富を出力する例:

me@myhost:~$ fortune
Mit jemand leben oder in jemand leben, ist ein großer 
Unterschied. Es gibt Menschen, in denen man leben kann, ohne mit 
ihnen zu leben, und umgekehrt. Beides zu verbinden, ist nur der 
reinsten Liebe und Freundschaft möglich.
        -- Goethe, Maximen und Reflektionen, Nr. 649
me@myhost:~$ 

以下の提案されたソリューションはこれを行うことができます。

me@myhost:~$ fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'
Die so genannten Naturdichter sind frisch und neu aufgeforderte, 
aus eine rüberbildeten, stockenden, manierierten Kunstepoche 
zurückgewiesene Talente. Dem Platten können sie nicht ausweichen, man 
kann sie daher als rückschreitend ansehen; sie sind aber 
regenerierend und veranlassen neue Vorschritte. -- Goethe, Maximen und Reflektionen, Nr. 258
me@myhost:~$ 

これは非常に良い提案ですが、必要な正確な解決策を提供するわけではありません。それは私が達成したいものと正反対です。 sed表現を理解したら、論理を逆にしようとします...できるだけ早くやりましょう! :D

答え1

echo $(fortune) | sed 's/-- /\n    -- /'

作成者行の前に先頭のスペースを挿入します。これはechoキャリッジリターンを削除し、作成者プレフィックスを改行と作成者プレフィックスに置き換えます。

答え2

これのほとんどは盗まれました。ここ:

fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'

元の答えから:

説明する:

  1. タグを生成して:a
  2. 現在の行と次の行をパターンスペースに追加しますN
  3. 最後の行の前にある場合は、生成されたラベルに分岐します$!ba$!最後の改行が必要なので、最後の行ではこれを行わないでください)。

最後のステップは私が修正した唯一のステップです。パターンは連結された2行なので、検索の--前に2つ以上のスペースと改行文字が続きます(私が知っている限り、パターンは引用符内にのみ表示されます)。改行文字を空白に置き換えて、--削除した内容を再度追加します。

今後:

There is always one thing to remember: writers are always selling somebody out.    
            -- Joan Didion, "Slouching Towards Bethlehem"

後ろに:

There is always one thing to remember: writers are always selling somebody out. -- Joan Didion, "Slouching Towards Bethlehem"

答え3

ファイルを単一の文字列として処理し、改行文字と2つの改行文字のみを置き換えることができます。このソリューションは、空白ではなく行を想定しています。

bash-4.1$ cat input 
duck
duck
duck
  -- goose
bash-4.1$ perl -0777 -ple 's/\n(?=[^\n]+\n[^\n]+\n)/ /g' input
duck duck duck
  -- goose
bash-4.1$ 

別の解決策は、行をメモリ内の行配列にし、その配列を空白で連結する(最後の行を除く)、最初に行数を計算してから、その数を使用して改行のタイミングを決定することです。スペースに変換するか、単独で保持する必要があります。

関連情報