【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行分を出力
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に保存