23999

[code]

    hoge hoge hoge
    hoge hoge
    hoge
    
[/code]

という内容のhoge.txtを sed 's/\n/ /g' しても置換されないのですが、その理由を教えていただきたいです  
sed 's/ /\n/g' の場合は正常に置換されているのですが...


CC BY-SA 3.0
2016-04-14T02:57:38.767
23998
2016-04-16T06:15:20.460
2016-04-14T04:38:30.213
3054
13299
question
sed
sedで改行をスペースに置換出来ない


`sed` は、入力を１行ごとに処理するからです。

多分、今 @doanobu さんがほしいと思っているのは`tr` です。

[code]

    tr '\n' ' '
    
[/code]

* * *

もうちょっと補足をすると、 sed の基本的な実行フローは、

  1. 一行メモリ(pattern space) に読み込む (改行は含まない)
  2. コマンド( `s/\n/ /g` などのこと)たちの実行
  3. メモリ(pattern space) の出力(この時再度改行が追加される)

の繰り返しです。なので、何かしらそれ用の操作の指定 ( @argus さんや @mjy さんのように ) をやらないと、改行に対して操作は実行できないです。


CC BY-SA 3.0
2016-04-14T03:05:18.187
23999
2016-04-16T06:15:20.460
2016-04-16T06:15:20.460
754
754
23998
answer


参考までに同じ事をする sed スクリプトを載せておきます。

[code]

    sed -n '1h;1!H;${x;s/\n/ /g;p;}' hoge.txt
    
[/code]

これは `hold space` を利用していますが、`pattern space` を使う場合は以下の様になります。

[code]

    sed -n ':1;$!{N;b1};${s/\n/ /g;p;}' hoge.txt
    
[/code]


CC BY-SA 3.0
2016-04-14T03:46:30.897
24002
2016-04-14T03:46:30.897
23998
answer

[code]

    # GNU の sed ならば
    sed -z 's/\n/ /g' hoge.txt
    
[/code]

GNUの`sed`は`-z`, `--null-data`オプションを指定すると、行の分割を`\n`でなくnull文字で行ないます。


CC BY-SA 3.0
2016-04-14T06:30:45.077
24004
2016-04-14T06:30:45.077
3054
23998
answer