この記事はtrapAdventCalendar 2017 11月12日の記事です。
こんにちはkriwです。sedの使い方について調べてみたので少しだけ紹介します。
sedとは
文字列の置換とかをいい感じにしてくれるコマンドです。
使い方
[addr]X[options]
- addr
- コマンドを適用する行
- X
- 1文字のsed内のコマンド
- options
- 一部のコマンドに使えるオプション
たとえば
sed -e 's/abc/xxx/'
とすればs(置換)がコマンドで/abc/xxx/
がオプションというわけになります。
文法通りに
sed -e '3s/abc/xxx/'
と、addrを指定して挙げることも可能です。
アドレス
[addr]X[option]
のaddrの部分についてです。
アドレスとして以下が指定可能です。
- 数値
前述の通り
sed -e '3s/abc/xxx/'
のようにすると3行目だけにコマンドが実行されます。
- 数値(ステップ)
seq 6 | sed -e '3~3s/.*/Fizz/'
とすると
1
2
Fizz
4
5
Fizz
と出来ます。
- 数値(範囲)
sed -e '1,3s/abc/xxx/'
とすると1から3行目までにコマンドを適用出来ます。
例えば、
seq 10 | sed -e '1,3s/./x/'
とすると1から3までがxで置換されていることがわかります。
- パターン
sed -e '/regexp/X[option]'
でマッチした行に対してコマンドを適用出来ます。
以下の例は1を含む行の文字をxで置換する例です。
seq 11 | sed -e '/1/s/./x/g'
出力
x
2
3
4
5
6
7
8
9
xx
xx
また、数値の範囲と組み合わせることも出来て、
seq 10 | sed -e '3,/[8-9]/s/./x/g'
とすると3行目から[8-9]
にマッチする最初の行まで(つまり8行目まで)にコマンドが適用されます。
1
2
x
x
x
x
x
x
9
10
正規表現でパターンが指定可能なので↑を少し変えて、
seq 11 | sed -e '/1$/s/./x/g'
とすると
x
2
3
4
5
6
7
8
9
10
xx
が出力されました。
数値のステップと一緒に組み合わせると
seq 100 | sed -e '3~3s/.*/Fizz/' -e '5~5s/[0-9]*\(.*\)/\1Buzz/'
でFizzBuzzも出来ますね。
コマンドの種類
普段使う分にはs(置換)コマンドだけで十分な気がしますが、削除とかコマンドの実行(いらない)などいろいろあります。
上げていくとキリが無い(面倒くさい)ので4つだけ紹介します。
- d
行の削除
"1"が含まれる行を削除
seq 10 | sed -e '/1/d'
出力
2
3
4
5
6
7
8
9
- e
コマンドの実行。
"a" -> "seq 10"に置換後にその行を実行。
echo a | sed -e 's/a/seq 10/;e'
1
2
3
4
5
6
7
8
9
10
- p
現在の行の内容を出力
"a" -> "seq 10"に置換後出力。この場合、sedの置換結果とpの二行が出力される。
echo a | sed -e 's/a/seq 10/;p'
出力結果
seq 10
seq 10
- q
終了
↑のpの例に対して置換と出力の間にqを挟んでみる。
echo a | sed -e 's/a/aa/;q;p
出力
seq 10
おわりに
sedを使えば複雑なテキストの編集も自動化出来てしまうコマンドです。
今回はアドレスの話とコマンドをいくつか紹介しただけですが、下記の参考の欄のGNUのマニュアルにもっと詳しく書いてあるので是非ご覧ください。
条件分岐やコマンドのグループ化、プレースホルダーなどもありました。