sed
で、スペース・タブ、空行に関する処理をまとめました。これらは、フィールドやレコードのセパレータとして使われるので、使いこなせるようになるとデータ解析の前処理が楽になります。
スペース・タブ(空白文字)の処理
複数のスペースを1つにする
1個以上のスペースは(space)(space)*
で表現できます。間違いが多いのは、(space)*
です。*
は「直前の文字を0回以上繰り返し」という意味をもつので、この場合「任意」になってしまいます。
書式
sed -e 's/(space)(space)*/(space)/g'
# (space)は' '
例 複数のスペースを1つに変換
複数のスペースを1つのスペースに置き替えます。
$ cat sed_space.dat aaa bbb ccc # (space)1個。 aaa bbb ccc # (space)2個・1個。 aaa bbb ccc # (space)3個。
$ cat sed_space.dat | sed -e 's/ */ /g' aaa bbb ccc aaa bbb ccc aaa bbb ccc
例 複数のスペースを1つに変換(指定間違い)
複数のスペースを1つのスペースに置き替えます。sed
で(space)*
を指定すると、全ての文字の前にスペースが挿入されてしまいます。
$ cat sed_space.dat | sed -e 's/ */ /g' # s/(space)が1個
a a a b b b c c c
a a a b b b c c c
a a a b b b c c c
タブ・スペースの混在を1つのスペースにする
タブやスペースは混在することが多くて整形するのが面倒です。1回以上のタブ又はスペースの繰り返しは、[(space)(tab)][(space)(tab)]*
で表現できます。(space)と(tab)の順序は関係ありません。端末(コンソール)でタブを直接入力するには、「Ctrlキー」を押しながら「v」・その後「Tabキー」を押します。
書式
sed -e 's/[(space)(tab)][(space)(tab)]*/(space)/g'
# (space)は' ' (tab)は' '
例 タブまたはスペースが混在をスペースを1つに変換
複数のスペースを1つのスペースに置き替えます。
$ cat sed_space2.dat aaa bbb ccc # スペース aaa bbb ccc # スペース・タブ aaa bbb ccc # スペース・タブ混在
$ cat sed_space2.dat | sed -e 's/[ ][ ]*/ /g'
# []内は(space)(tab)
aaa bbb ccc
aaa bbb ccc
aaa bbb ccc
行末のスペースを削除
行末に不要なスペースが残っていると連結処理などで地味に邪魔になることがあります。行末は$
で表現します。「$」直前の空白文字を削除「//」します。
書式
sed -e 's/[(space)(tab)]*$//'
# (space)は' ' (tab)は' '
例 行末のスペース・タブを削除
行末のスペース・タブを削除します。
$ cat sed_space3.dat aaa bbb ccc # スペース・タブ混在 aaa bbb ccc # スペース・タブ混在 aaa bbb ccc # スペース・タブ混在
$ cat sed_space3.dat | sed 's/[ ]*$//' > sed_space4.dat
# []内は(space)(tab)。結果は、sed_space4.datをエディタで確認。
空行・1行目・最終行の削除
sedを使った空白行の処理です。
空白行を削除
空白行にレコードの区切りなど意味があるときもありますが、無駄な空白行はとても邪魔です。空白行は、/^$/
で指定して、sed
のdコマンドで削除します。
例 行末のスペース・タブを削除
不要な空白行を削除します。
$ cat sed_space5.dat aaa bbb ccc aaa bbb ccc aaa bbb ccc
$ cat sed_space5.dat | sed -e '/^$/d' aaa bbb ccc aaa bbb ccc aaa bbb ccc
1行目・最終行を削除
1行目は不要なヘッダーがあったり、最終行は単なる空白行だったり、1行目と最終行は削除することも多いです。sed
のdコマンドで行番号を指定して削除すると簡単です。
例 1行目削除
1行目を削除します。
$ cat sed_space6.dat 1 aaa bbb ccc 2 aaa bbb ccc 3 aaa bbb ccc
$ cat sed_space6.dat | sed -e '1d' 2 aaa bbb ccc 3 aaa bbb ccc
例 最終行削除
最終行目を削除します。最終行の指定は$
です。
$ cat sed_space6.dat 1 aaa bbb ccc 2 aaa bbb ccc 3 aaa bbb ccc
$ cat sed_space6.dat | sed -e '$d' 1 aaa bbb ccc 2 aaa bbb ccc