Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

【Linux】文字列の検索・置換

現在、研究室用の新人教育ページを作っているのですが、せっかく作ったので一部転載。 文字列を検索・置換するLinuxコマンドです。

grep: 文字列の検索

対象ファイルから特定の文字列を含む行だけを表示します。

$ grep hogehoge sample.txt  # sample.txtの中からhogehogeを含む行を表示
$ grep -v hogehoge sample.txt  # sample.txtの中からhogehogeを ”含まない” 行を表示
$ grep -n hogehoge sample.txt  # 行番号をつけて表示
$ grep -3 hogehoge sample.txt  # hogehogeを含む行±3行を表示
$ grep -n3 hogehoge sample.txt  # hogehogeを含む行±3行を行番号をつけて表示

また、ファイルだけでなく以下のような使い方もできます。| はリダイレクトを表し、 ls コマンドの出力結果に対して grep を使っています。

$ ls workdir/* | grep Rad21 # workdir内のファイルのうち Rad21 を含むファイルを表示
$ ls workdir/* | grep txt$  # workdir内のファイル名がtxtで終わるファイルを表示

sed: 文字列の置換

以下は test.txt内の aaa を AAA に変換し、modified.txt に保存する例です。

$ cat test.txt
  aaa
  bbb
  ccc
$ sed -e 's/aaa/AAA/g' test.txt > modified.txt
$ cat modified.txt
  AAA
  bbb
  ccc

高度な使い方もできます。

$ sed -n -e 1p # 先頭の行のみを出力
$ sed -n -e \$p # 最後の行のみを出力, \ はシェルのエスケープ
$ sed -n 5,\$p # 5行目~最後の行まで
$ sed -n -e 6,15p # 6行目から15行目を出力
$ sed -n -e 1~2p # 奇数行のみを出力
$ sed -n -e 1~5p # 1行目、6行目、11行目、16行目、、、を出力
$ sed -i -e '10,10d' # ファイルの10行目を消す
$ sed -n -e /xxx/p # 正規表現にマッチする行を出力, " grep -e xxx" と同じ
$ sed -e /xxx/d # 逆に正規表現にマッチしない行を出力, "grep -v -e xxx" と同じ
$ sed -n -e '\%xxx%p' # 正規表現にマッチする行を出力, 先頭に \ を付ければ、正規表現を囲む記号はなんでもよい
$ sed -n -e /xxx/,+3p # 正規表現にマッチする行から3行分を出力, 正規表現にマッチするごとに最低3行が出力される
$ sed -n -e 20,+3p # 20行目から23行目までの4行分を出力

参考: 指定行削除するコマンド(sed - それマグで!

tr: 文字列の置換 (1文字単位)

trは1文字単位で文字列を置換します。sedの方が高機能ですが、ワンライナーで改行をスペースに変換したい場合などに威力を発揮します。

$ cat test.txt
aaa
bbb
ccc
# 以下のコマンドは catで test.txtの内容をリダイレクトで trに送っている。結果は modified.txtに保存。
$ cat test.txt | tr '\n' ' ' > modified.txt
$ cat modified.txt
aaa bbb ccc

以下のような使い方もできます。

$ cat text1.txt | tr ',' '\n' > text2.txt  # カンマを改行に変換して text2.txtに保存
$ cat text1.txt | tr ' ' '\t' > text2.txt  # スペースをタブに変換して text2.txtに保存
$ tr -d "\r" text1.txt > text2.txt   # Windows形式の改行コードをLinux形式に変換し text2.txtに保存
$ tr -s " " text1.txt > text2.txt   # text1.txtの連続したスペースを1つに変換して text2.txtに保存
$ tr -s "\r" text1.txt > text2.txt   # text1.txtの連続した改行を1つに変換して text2.txtに保存