概要
sed
コマンドは「Stream EDitor」のことです。
Streamとは、Wikipediaでは以下のように記載されています。
ストリーム(英: stream)とは、データを、比較的小さい単位が連続したものと捉え、上流から下流へ「流れるもの」とみなし、そのデータの入出力・送受信(途中段階を含む)を最小限の滞留とさせ低遅延処理となるように扱う形態を指す。またその操作のための抽象データ型を指す[1]。
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
すなわち、標準入力(stdin)や標準出力(stdout)のエディタがsed
コマンドです。
基本的な使い方
sedコマンドの基本的な使い方は以下の通りです。
$ sed "{対象となる初めの行(最初からの場合はs)}/{置換前の文字列}/置換後の文字列}/{出現番号(最後までの場合はg)} 入力ファイル名"
例えば、以下のような内容が記載されているexample.txt
があります。
hello hello
hello world
これのhello
を任意の単語(例えばhoge
)に置き換えるときは以下のように記述します。
$ sed "s/hello/hoge/g" example.txt
出力
hoge hoge
hoge world
また、この出力はexample.txt
を書き換えるわけではなく、標準出力されます。
用途別使用例
変更した箇所だけ表示する
以下のようなファイルexample.txt
があります。
helo world!!
このhello
という文字列をfuga
に置き換えて標準出力するには以下のコマンドを実行します。
$ sed -n "s/hello/fuga/p" example.txt
fuga world!
パターンマッチに合致する箇所を削除
以下のようにすることで、hello
を削除できます。
$ sed "s/hello//g" example.txt
world!
パターンマッチに合致する行を削除
以下のようにすることで、hello
を含む行すべてを削除できます。
$ sed -e "/hello/,//d" example.txt
電話番号形式の数値だけ表示する
正規表現を用いて、以下のようにします。
$ echo 'TEL: 0120-000-000' | sed "s/[A-Z :]//g"
0120-000-000
HTMLから特定のタグの要素を削除する
以下の例では<td>
タグを消して、表の中身だけ出力しています
$ curl -X "GET" https://nlftp.mlit.go.jp/ksj/gml/codelist/PrefCd.html | sed -e "s/^ *\(<td>\)* *\(.*\)<\/td><td>\(.*\)<\/td>\(<td>\)*/\2,\"\3\"/g"
少し複雑なので、分けて解説していきます。
まず、sed
の-e
オプションは複数条件を指定するときに使用するオプションです。
sed文での対象範囲はs/{hogehoge}/g
という形なので、ここではダウンロードしたHTML全体となります。
ここで正規表現の意味は以下の通りです。
-
^
: 行の先頭 -
*
: 直前のパターンの0回以上の繰り返し -
\(<td>\)*
:<td>
と</td>
で囲まれた部分を0回以上繰り返すグループ -
*
: 直前のパターンの0回以上の繰り返し -
\(.*\)<\/td><td>\(.*\)<\/td>
:<td>
と</td>
で囲まれた部分の2つのグループにマッチ。それぞれのグループは0文字以上の任意の文字列(任意のデータ)にマッチ -
(<td>\)*
: とで囲まれた部分を0回以上繰り返すグループ
よって^ *\(<td>\)* *\(.*\)<\/td><td>\(.*\)<\/td>\(<td>\)*
では<td></td>
で囲まれた部分を抽出します。