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回)部分がスペースに置き換えられてしまっているのです。
コメント