sed

sed は文字列置換処理を目的として作られたスクリプト言語である。ほとんどの場合、1 行の記述だけで目的を達成することができる。Linux のコマンドのように使えて、他のコマンドと連携して複雑な処理も容易に処理してしまう。

文字列置換

各行に最初に出現する「TAG」を「*」に置換。 sed 's/TAG/*/' input.fa
各行に出現する 3 番目の「TAG」を「*」に置換。 sed 's/TAG/*/3' input.fa
各行に出現するのすべての「TAG」を「*」に置換。 sed 's/TAG/*/g' input.fa
各行に出現するのすべての「TAG」、「TAA」、「TGC」を「*」に置換。 sed 's/[TAG|TAA|TGC]/*/g' input.fa
「>」を含む行に対して、T を U に置換。i は大小文字を区別しないときにつけるオプションである。 sed 's/^>/s/T/U/gi' input.fa
「>」を含まない行に対して T を U に置換。 sed 's/^>/!s/T/U/g' input.fa

後方参照

sed は後方参照が行える。後方参照したい部分を \(\) で囲み、参照は \1\2 などのように行う。(\ はフォントの種類によって、バックスラッシュに見えたり、円マークに見えたりする。)

次は、multi.fa ファイル中の「>NM000001」のようなパターンを「>NM_000001」に置換する例。

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

その他の便利な使い方

置換された行だけを画面に出力する。

sed -n 's/AAA/BBB/p' input.txt

大文字と小文字を区別しない。

sed 's/AAA/BBB/i' input.txt

複数の置換作業を 1 行に書くには、次のようにする。

sed -e 's/AAA/BBB/g' -e 's/CCC/DDD/g' input.txt

シェルスクリプトのファイルの中で、sed スクリプトを複数行に分けて書くこともできる。

sed -e '
  s/A/a/g
  s/C/c/g
  s/G/g/g
  s/T/t/g' input.txt

ファイル中の 51 行目~ 100 行目までのデータのみに対して置換を行う。

sed '51,101 s/AAA/BBB/g' input.txt

#START にマッチした行から #END にマッチした行までのデータのみに対して置換を行う。

sed '/#START/,/#END/ s/GC/CG/g' input.txt

指定範囲以内の行を削除するようなこともできる。例えば「#START」の行から「#END」の行までを削除する場合は以下のようにする。(#START と #END の前後に改行を入れてから、削除を行う。)

cat input.txt | \
    sed 's/#START/\n&\n/g' | \
    sed 's/#END/\n&\n/g' | \
    sed 's/#START/,/#END/d'

sed で行の読み飛ばしも可能である。#SKIP にマッチしたら、2 行読み飛ばしたい場合は以下のようにする。

sed '/#SKIP/{N;N; s/GC/CG/g}' input.txt

80 文字ずつ改行する。

sed 's/.\{80\}/&\n/g' input.txt

アドレスコマンド

sed でよく利用するオプション。

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

メタ文字

sed の正規表現に利用できるメタ文字。いくつかのメタ文字(「\+」や「\(」など)は、エスケープして使う必要がある。

メタ文字意味
^先頭
$後尾
.任意の 1 文字
*直前の文字の 0 回以上の繰り返し
\+直前の文字の 1 回以上の繰り返し
\?直前の文字が 0 回または 1 回のみ出現
[]文字クラス、[abc0-9] ならば数字と a, b, c のどれか 1 文字
\|OR、[ab|ap] ならば ab または ap
\{3\}直前の文字が 3 回だけ出現
\{3,5\}直前の文字が 3〜5 回出現
\b単語区切り