【sed】連続するスペースを1つにまとめる方法

記事内に広告が含まれています。

sedで連続するスペースを1つにまとめる方法

どちらの方法でも連続するスペースを1つにまとめることが出来ます。

sed -e 's/ \+/ /g'
sed -e 's/  */ /g'

sed -e 's/ \+/ /g'

スペース部分をわかりやすいように(スペース)で置き換えて説明します。

sed -e 's/(スペース)\+/(スペース)/g'

「\+」は直前の文字の1回以上繰り返しを表すメタ文字なので、「(スペース)\+」これで1回以上繰り返すスペースを表しています。

置換後を「(スペース)」として、1回以上繰り返すスペースを1つのスペースに置換しています。

テスト用に下記のようなファイルを作成しました。

$ cat space_01.txt 
a     b  c     d  e
a b c d e
    abc    d  e

sedで複数のスペースを1つにまとめてみます。

複数スペースは1つにまとまり、元々1つのスペースだった部分はそのまま表示されています。

$ sed -e 's/ \+/ /g' space_01.txt 
a b c d e
a b c d e
 abc d e

ちなみに、先頭のスペースを削除したい場合は、下記のように「-e 's/^ //g'」を追加します。

$ sed -e 's/ \+/ /g' -e 's/^ //g' space_01.txt 
a b c d e
a b c d e
abc d e

sed -e 's/  */ /g'

スペース部分をわかりやすいように(スペース)で置き換えて説明します。

sed 's/(スペース)(スペース)*/(スペース)/g'

置換前はスペースを2つ続けることが大事です。

実際に複数のスペースをまとめてみます。

$ sed -e 's/  */ /g' space_01.txt 
a b c d e
a b c d e
 abc d e

ちなみに置換前の部分を「sed 's/(スペース)*/(スペース)/g'」といったように1つのスペースにしてしまうと、下記のように置き換えられてしまいます。

$ sed -e 's/ */ /g' space_01.txt 
 a b c d e 
 a b c d e 
 a b c d e 

これは、「*」が直前の文字を0回以上の繰り返しを表すメタ文字であるため、「 *」と指定するとスペースが0回以上の繰り替えしが対象となってしまい、その結果スペースが連続している部分とスペースがない(スペースが0回)部分がスペースに置き換えられてしまっているのです。

コメント

タイトルとURLをコピーしました