sed テキストを行ごとに置換・削除・抽出する
sed [オプション] 'スクリプト' [ファイル...]試してみる
sed 's/debug=false/debug=true/' app.conf各行の最初に見つかった debug=false を置き換えて表示します。ファイルは変わりません。
sed '/^#/d' app.conf行頭が
sed -n '2,3p' app.conf-n で自動出力を止め、2〜3行目だけを表示します。
sed -n '/404/p' access.log404 を含む行だけを表示します。grep と同じ使い方もできます。
sed -E 's/([0-9.]+) - - .*"(GET|POST) ([^ ]+).*/\1 \3/' access.log拡張正規表現とグループで、IPアドレスとパスだけに整形します。
sed -i.bak 's/8080/9090/' app.conf && cat app.conf-i でファイルを直接書き換えます。.bak を付けると元のファイルが app.conf.bak に残ります。
主なオプション
-n | 自動で行を表示しない(p コマンドと組み合わせる) |
|---|---|
-e スクリプト | スクリプトを追加する。複数回指定できる |
-i[拡張子] | ファイルを直接書き換える。拡張子を付けるとバックアップを残す |
-E | 拡張正規表現を使う(-r も同じ) |
-f ファイル | スクリプトをファイルから読む |
解説
基本の形
sed は、入力を1行ずつ読み、スクリプトに従って加工して出力します。元のファイルは、-i を付けない限り変わりません。いちばん使うのは置換で、s/探す文字/置き換える文字/ と書きます。
置換のフラグ
何も付けないと、1行の中で最初に見つかった1か所だけを置き換えます。末尾に g を付けると、その行のすべてを置き換えます。i を付けると大文字と小文字を区別しません。区切りは / 以外でも、s#/usr#/opt# のように使えます。パスを扱うときに便利です。
アドレス(対象の行)
コマンドの前に行を指定できます。3d は3行目、2,4d は2〜4行目、/正規表現/d は一致した行を削除します。$ は最終行です。
主なコマンド
d は削除、p は表示、s は置換です。p は自動出力と重なって2回表示されるため、-n と組み合わせて使います。
正規表現
標準では基本正規表現で、+ や | や () の前にバックスラッシュが必要です。-E を付けると、そのまま書けます。置換後の \1 は、括弧で囲んだ部分への参照で、& は一致した全体です。
-i の注意
-i は元に戻せません。不安なときは -i.bak のようにバックアップを残します。