sed 改行文字をスペースに置き換える

sed 改行文字をスペースに置き換える

sedを使用して改行文字を別の文字に置き換えるには?

入力する:

 I cannot conceive that anybody will    
 require multiplications at the rate of 
 40,000 or even 4,000 per hour ...      

 -- F. H. Wales (1936)                  

希望の出力:

I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ...  -- F. H. Wales (1936)

私は試した:

> pbpaste | sed 's/\n/ /g' 

ただし、入力と同じ結果が出力されます。私はそれを確認し、cat -ev期待どおりに印刷したので、これが改行文字であることを知っています。$

これを行うためのより良いコマンドはありますか?


これにより、新しい行の間に余分なスペースが表示されます。私も削除したいです。それで、空白のある文章と同じです。

> pbpaste | cat -ev
 I cannot conceive that anybody will    $
 require multiplications at the rate of $
 40,000 or even 4,000 per hour ...      $
                                        $
 -- F. H. Wales (1936)                  ⏎   

答え1

trそれはおそらく仕事のためのより良いツールでしょう。以下を試してください

pbpaste | tr '\n' ' '

あなたの入力に基づいて、次のような結果が得られます。

I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ...  -- F. H. Wales (1936) 

答え2

次のコマンドを繰り返すとsed(GNU slurp拡張がなくても)、これを行うことができます。-zN

$ sed -e :a -e '$!N;s/ *\n */ /;ta' -e 'P;D' input
 I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)                  

本質的に同じコマンドの説明については、例を参照してください。40. 前の行が等号「=」で始まる場合は、前の行の後に行を追加します。存在するSed専門用語の説明、パート1

答え3

@QISに同意します。

sedが機能しない理由はいくつかあります。

1つは、sedデフォルトでは入力が一度に1行ずつ処理されるため、sed改行文字が表示されないことです。部分ラインの。区切り記号です。〜サイわかりました。基本的にはそうです。

もう1つの問題は、GNUが改行表現をsed実装しているのに対し、BSD(OSXバージョン)は実装しないことです。'\n'sed

sedあなたの質問を読む将来のGNUユーザーのために、sedこのオプションを使用してGNUに入力ファイルをNULで区切られた文字列のリストとして扱うように指示することができます-z。入力にNULバイトが含まれていないと仮定すると、これはsedGNUユーザーのためのオプションです。

$ pbpaste | sed -z 's/\n/ /g'

echo単純で推奨されない方法は、コマンドの置き換えのために引用符で囲まれていない改行文字を受け取ったときにそれを空白に置き換えることを利用することです。さらに、echo複数のスペース(または改行)は単一のスペースに変換されます。したがって、これはおそらくあなたにも効果があるでしょう:

echo $(pbpaste)

答え4

どちらもテキストの書式を変更するのに便利なツールfmtです。par

どちらも改行を空白に変更した後(たとえば)、テキストを1つの長い行に再フォーマットするために使用できますtr

$ tr '\n' ' ' < input.txt | fmt -w 999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ...    -- F. H. Wales (1936)

$ tr '\n' ' ' < input.txt | par w999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)

fmtとparの出力は若干異なります。 fmtとparの...間には4つのスペースがありますが、--parはスペースを1つに減らします。


fmtとに関する追加情報par

fmt何十年も使用されており、ほとんどすべてのUNIXシステムで利用可能な標準ユーティリティです。 GNU / LinuxシステムはcoreutilsGNUパッケージにあります。

$ fmt < input.txt 
I cannot conceive that anybody will require multiplications at the rate
of 40,000 or even 4,000 per hour ...

  -- F. H. Wales (1936)

ただし、これは非常に簡単で、段落形式を再指定する方法の多くの制御を許可しません。また、混乱を招く可能性がある先行および/または末尾の文字(>電子メールや/* ... */コメントの引用など)に対して特別な処理を実行しません。ではありません。

parより柔軟で有能です。 Cスタイル/* ... */のコメント、ボックステキスト、多段階参照を含むEメールなどの書式を再指定できます。次の例では、実際に実行される操作を示していません。

$ par < input.txt 
I cannot conceive that anybody will require multiplications at the rate of
40,000 or even 4,000 per hour ...

  -- F. H. Wales (1936)

次の例()は機能をman par示し始めます。par

Before:

   John writes:
   : Mary writes:
   : + Anastasia writes:
   : + > Hi all!
   : + Hi Ana!
   : Hi Ana & Mary!
   Please unsubscribe me from alt.hello.

After "par Q+:+ q":

   John writes:

   : Mary writes:
   :
   : + Anastasia writes:
   : +
   : + > Hi all!
   : +
   : + Hi Ana!
   :
   : Hi Ana & Mary!

   Please unsubscribe me from alt.hello.

1990年代にこの機能を発見した後、私はvi / vimで私が書いているEメール(または読めない長い行を持つ他の人が送信したEメール)、コードコメント、その他のテキストのフォーマットを再指定するために毎日この機能を使ってきました。 IMO、parは欠かせない必須プログラムです。

関連情報