2259


例えば `sample.txt`というファイルがあり、その中に下のような文章が書かれていたとします。

[code]

    これは普通の質問だな。ただ、この質問は良い質問だ。でも、これは悪い質問だ。
    
[/code]

このテキストファイルに対し、「。」毎に改行を入れたいと思ったとします。上の例でいうならば、下のようなことを意図しています。

[code]

    これは普通の質問だな。
    ただ、この質問は良い質問だ。
    でも、これは悪い質問だ。
    
[/code]

そこで、`sed "s/。/。\n/g"
sample.txt`という形で改行を挿入するのを試みました。すると、結果としては最後の`。`でも改行が入ってしまい、空行が最後についてしまいます。

渡し先で空行を無視するようにもできますが、どうせならこの置換の時に、最後の空改行を防ぐ形にしたいと思うのですが、どのようにするのがベターでしょうか?


CC BY-SA 3.0
2014-12-20T14:40:41.097
2257
2014-12-22T08:31:51.193
2014-12-20T15:10:40.557
3158
939
question
sed 正規表現
改行を挿入する形で置換しようとしたとき、最後に余計な改行が入る


幾つかやり方はあると思いますが、 `。` のあとに任意の文字があることを利用した、 こんなやり方はどうでしょうか。

[code]

    sed -e 's/。\(.\)/。\n\1/g' sample.txt
    
[/code]


CC BY-SA 3.0
2014-12-20T14:59:01.847
2259
2014-12-20T14:59:01.847
208
2257
answer


GNU版の sed をお使いであれば、以下の様にしてみてはいかがでしょうか。

[code]

    $ sed -r 's/。/。\n/g;s/\n+$//' sample.txt
    
[/code]


CC BY-SA 3.0
2014-12-20T15:03:45.940
2262
2014-12-20T15:03:45.940
2257
answer


需要があるのかわかりませんが`mac`の`sed`では

[code]

    sed -e 's/。\(.\)/。\'$'\n\\1/g' sample.txt
    
[/code]

となります。

(ちょっと独自仕様なので、普通は`brew install gnu-sed`をして`gsed`を使うべきかと。。)


CC BY-SA 3.0
2014-12-20T15:17:37.180
2263
2014-12-20T15:17:37.180
3313
2257
answer


> ＞ 空行が最後についてしまいます。

このようになる そもそもの原因は sample.txt が改行で終わっていることなのでは？

emacs で普通に 文書を作って、od で文末がどうなっているか調べてみました。

[code]

    $ cat sample.txt | od -cx | tail -1
    0000140   い  **  **  質  **  **  問  **  **  だ  **  **  。  **  **  \n
                 81e3    e884    aab3    95e5    e38f    a081    80e3    0a82
    0000160
    
[/code]

最後に 改行がついていることがわかります。

この状態で "。” を "。\n" に変換すれば、ファイルの最後は "。\n\n" となります。

ファイルの最後が "。" や "。\n" のどちらの場合でも改行なしに "。" で終わらせるように変換するコマンド ruby
のワンライナーで書いてみました。

[code]

    $ cat sample.txt | ruby -e 'line=STDIN.gets; printf line.strip.gsub(/。/, "。\n").chomp'
    
[/code]

これを実行すると次のようになります。(最後が改行されずに shell のコマンドプロンプトが表示されます)

[code]

    $ cat sample.txt | ruby -e 'line=STDIN.gets; printf line.strip.gsub(/。/, "。\n").chomp'
    これは普通の質問だな。
    ただ、この質問は良い質問だ。
    でも、これは悪い質問だ。$
    
[/code]


CC BY-SA 3.0
2014-12-20T17:49:55.850
2290
2014-12-20T17:49:55.850
2987
2257
answer


純粋に「空行がでてしまう」ということに対して汎用的なアプローチをするなら

`sed "s/。/。\n/g" sample.txt | grep -v '^$'`

といった具合に空行を除去するという方法もあります。

ただし、変換したファイルに空行のみの行を許容する場合は、この方法ではその空行も除去されてしまうため、お気をつけ下さい。


CC BY-SA 3.0
2014-12-22T08:31:51.193
2376
2014-12-22T08:31:51.193
982
2257
answer