sed

sed は、テキストの置換処理を行う目的で作られたスクリプト言語である。ほとんどの場合、1 行のスクリプトを記述だけで、テキストの置換などをはじめとして、後方参照を利用した置換などの複雑な処理も可能である。インターネットで one-liners for sed などと検索する、様々な処理を 1 行の sed スクリプトで行う例を多く見つけることができる。

文字列置換

sed コマンドを利用して、文字列の置換を行うとき、sed コマンドに続いて -e オプションを付けて、その後ろに置換パターンなどを書く。

基本的な置換方法

例えば、sample.fa ファイル中の、各行に出現する最初の TAG を * に置換する場合は以下のようにする。

sed -e 's/TAG/*/' sample.fa

各行に出現するすべての TAG を * に置換する場合は以下のように g を付け加える。

sed -e 's/TAG/*/g' sample.fa

また、次のように、各行に出現する 3 番目 TAG だけを * に置換する場合もできる。

sed -e 's/TAG/*/g' sample.fa

大文字と小文字を区別しない場合は i オプションを付け加える。

sed -e 's/TAG/*/gi' sample.fa

複数の置換を連続して行う場合は、複数のパターンを同時に書く。この場合、1 番目の置換が終わってから、2 番目の置換が行われる。そのため、次の例では、まずすべての行にある TAG を TAA に置換してから、次に TAA を * に置換している。

sed -e 's/TAG/TAA/g' -e 's/TAA/*/' sample.fa

正規表現を利用した置換方法

置換条件のところに正規表現を利用することができる。この場合、オプションとして -E をつける。例えば、以下のようにすると、各行に出現するすべての TAG、TAA および TGC を * に置換することができる。

sed -E 's/[TAG|TAA|TGC]/*/g' sample.fa

条件付きの文字列置換

すべての行ではなく、特定の行に対してのみ置換を行うことも可能である。この場合、置換パターンの直前に、その条件を正規表現あるいは sed 特有の書き方で付け加えればよい。

例えば、ファイルの中の「>」で始まる行に対して、文字 NN を NM に置換するには以下のように /^>/ を置換パターンの前に加える。

sed -E '/^>/s/NN/NM/g' sample.fa

逆に、ファイルの中の「>」で始まらない行に対して、文字 TAG を * に置換するには以下のようにする。

sed -E '/^>/!s/TAG/*/g' sample.fa

特定の行に対してのみ置換を行う場合は、置換パターンの前にその行番号を指定する。例えば、3 行目のみに対して、置換を行う場合は以下のようにする。

sed -e '3s/TAG/*/g' sample.fa

また、行の範囲を指定することも可能である。例えば、3 行目から 6 行目までの行のみに対して、置換を行う場合は以下のようにする。

sed -e '3,6s/TAG/*/g' sample.fa

3 行目以外の行に対して、置換を行う場合は以下のようにする。

sed -e '3!s/TAG/*/g' sample.fa

また、3 行目から 6 行目までの行以外の行に対して、置換を行う場合は次のようにする。

sed -e '3,6!s/TAG/*/g' sample.fa

例えば、begin 文字列を含む行から end を含む行までの間の行に対して、GC を CG に置換を行う場合は、以下のように範囲を指定する。

sed -e '/begin/,/end/ s/GC/CG/g' sample.fa

この条件も逆転させることができ、つまり begin 文字列を含む行から end を含む行までの間の行以外の行に対して、置換を行う場合には次のようにする。

sed -e '/begin/,/end/ !s/GC/CG/g' sample.fa

後方参照

sed は後方参照をサポートしている。テキストがあるパターンにマッチングした部分を、あとで利用することができる。例えば、「>NM000001」のようなパターンを「>NM_000001」に置換する場合では、まず「>NM」と「NM000001」を覚えておき、次に、この部分を置換する際に、覚えた文字列を再び呼び出して、修正してから置換を行うことができる。なお、MacOS で「\1 not defined in the RE」が表示される場合、「sed -E」の代わりに「sed -e」を用いると実行できる場合がある

sed -E 's/^>\([A-Z]\{2\}\)/>\1_/g' sample.fa

この場合、後方参照したい部分を \(\) で囲み、参照は \1\2 などのように行う。なお、Windows の日本語環境では、バックスラッシュ \ が円マーク ¥ として表示される。

アドレスコマンド

sed で利用するアドレスコマンドとその意味。

オプション意味
dその行を出力しない
pその行を出力する、-n をつけると変換前のものは出力しない
s置換
y一文字ずつ置換
q終了

sed で利用できる正規表現

sed で利用できる正規表現。

grepsedawk
...
***
^^^
$$<$<
¥( ¥)¥( ¥)( )
\1 \2 \3\1 \2 \3\1 \2 \3
[ ][ ][ ]
¥{n, m¥}¥{n, m¥}{n, m}
¥{n, ¥}¥{n, ¥}{n, }
¥{n¥}¥{n¥}{n}
\+\++
\??
\|\||