LoginSignup
2
2

【備忘録】sedコマンドを理解する

Posted at

概要

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>で囲まれた部分を抽出します。

参考資料

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2