sedによるテキスト処理入門

文:Vincent Danen(TechRepublic) 翻訳校正:原井彰弘
2007-12-25 15:00:00
  • このエントリーをはてなブックマークに追加

 sedは非常に手軽でかつ強力な、軽量テキスト処理ツールである。「stream editor」を省略してsedと名付けられており、テキストの操作やフィルタリングを行うことが可能だ。ここでは、sedの使い方をいくつかお見せしよう。

 sedは「受け渡し」の際によく用いられる。あるコマンドの出力をパイプでsedに渡し、その出力の内容を修正して書式を整えた上で、それを新しい出力とする、といった使われ方をするのだ。また、sedではテキストファイルを扱うことも可能である。変換されたテキストは標準出力に出力されるので、他のファイルにリダイレクトもできる。

 sedの強力さを説明するには、例をいくつか見ていただくのが一番分かりやすい。

$ printf "line one\nline two\n" | sed -e 's/.*/( & )/'
( line one )
( line two )

 この例では2行の出力があるが、sedはそれぞれの行を括弧でくくる変換を行っている。sedではパターンマッチングでこの変換を実現しており、s/[パターン]/[置換後の文字列]/という書き方で変換を行うことができる。なお、この例では区切り文字としてバックスラッシュ(\)を用いているが、カンマやパイプ(|)といった別の文字も区切り文字として利用できる。

 上記の例では、マッチを行うパターンは「.*」(すべて)である。また、置換後の文字列ではプレースホルダーとして、マッチしたテキストすべてを表すアンパサンド(&)を利用している。この例の場合、アンパサンドには一行すべてが含まれているので、置換結果は「( [テキスト] )」となる。

 sedを使用すると、テキストの順序を入れ替えることもできる。一行に2つの語が含まれているファイルがあると仮定しよう。今、2番目の語を1番目に表示し、語の間をカンマで区切りたいとする。この処理は、次のように記述することが可能だ。

$ printf "line one\nline two\n" | sed -e 's/\(.*\) \(.*\)/\2,\1/'
one,line
two,line

 line oneがone,lineに変換されているのがお分かり頂けただろうか。このパターンでは、括弧を利用してマッチブロックを作成しており、「(.*) (.*)」はそれぞれ文字列、スペース、そしてもう一つの文字列にマッチする。このとき、マッチした2つの文字列はバッファに保持され、1つ目の文字列は\1で、2つ目の文字列は\2で表現できるようになる。置換後の文字列では、これらのバッファを用いて自由に書式を組み立てることが可能になるのだ。この例では、2つ目の文字列、カンマ、1つ目の文字列の順序で置換語の文字列を作成している。

 sedを用いると、特定のファイル名を変更するコマンドを作成するなど、非常に興味深い処理を行うことも可能だ。次の例を見て欲しい。

$ ls -1 *.txt | sed -e 's/.*/mv & &.old/' >execute; sh execute && rm -f execute

 このコマンドチェーンでは、sedはls -1 *.txtの出力を受け取り、ファイル名をlist.txtからmv list.txt list.txt.oldに変更した上で、executeというファイルに出力している。そしてその処理が完了すると、出力されたexecuteファイルをshシェルで実行し、リストアップされたファイルそれぞれに対してmvコマンドを実行している。また、作業が正常に完了した場合には、executeファイルの削除も行われるようになっている。

 ここでは、sedのごく一部の機能のみについて紹介した。sedはとてつもなく強力であり、興味深い利用方法がたくさんある。さらに学ぶ価値は間違いなくあるだろう。

sedに関するリソース

  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]