読者です 読者をやめる 読者になる 読者になる

sedで連続する空白を処理するメモ

普通にしたらうまく置換できなかったのでメモ

環境
gnu bash 4.2.10(1)
gnu sed 4.1.1

正規表現メモ SEDの項目を確認しつつ最初やってみたコマンド

echo " 3409 pts/0    00:00:00 bash" | sed 's/\s+/ /g'

結果は変わらず。

 3409 pts/0    00:00:00 bash


manを見たら-rをつけるとPerl5互換の正規表現が使えるらしい

echo " 3409 pts/0    00:00:00 bash" | sed -r 's/\s+/ /g'

変わった。

 3409 pts/0 00:00:00 bash

オプションの-rを付けずにする方法ないかなと思って色々試行錯誤してみた。
1.うまくいくけどなんかね・・・

echo " 3409 pts/0    00:00:00 bash" | sed 's/\s\s\+/ /g'

2.classは使えない・・・?なんかキャラクタリストとして解釈されてた。

echo " 3409 pts/0    00:00:00 bash" | sed 's/[:space:]\+/ /g'

3.ここで考えて、\s+の時は最短マッチで置換してるのでは・・・と思い以下にした。

echo " 3409 pts/0    00:00:00 bash" | sed 's/\s{2,}/ /g'

うまくいった。
うーん・・・どうなのこれ。使い方が間違ってるのだろうけど・・・
よくわからない。