東京工業大学
デジタル創作同好会

2017年11月11日 | メンバーブログ

sedについて調べてみた。

kriw

この記事はtrapAdventCalendar 2017 11月12日の記事です。
こんにちはkriwです。sedの使い方について調べてみたので少しだけ紹介します。

sedとは

文字列の置換とかをいい感じにしてくれるコマンドです。

使い方

[addr]X[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つだけ紹介します。

"1"が含まれる行を削除

seq 10 | sed -e '/1/d'

出力

2
3
4
5
6
7
8
9
echo a | sed -e 's/a/seq 10/;e'
1
2
3
4
5
6
7
8
9
10

"a" -> "seq 10"に置換後出力。この場合、sedの置換結果とpの二行が出力される。

echo a | sed -e 's/a/seq 10/;p'

出力結果

seq 10
seq 10

↑のpの例に対して置換と出力の間にqを挟んでみる。

echo a | sed -e 's/a/aa/;q;p

出力

seq 10

おわりに

sedを使えば複雑なテキストの編集も自動化出来てしまうコマンドです。
今回はアドレスの話とコマンドをいくつか紹介しただけですが、下記の参考の欄のGNUのマニュアルにもっと詳しく書いてあるので是非ご覧ください。
条件分岐やコマンドのグループ化、プレースホルダーなどもありました。

参考

GNUのマニュアル
sedコマンドの備忘録 (Qiita)

この記事を書いた人
kriw

CTFを少しやっています。

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2016年12月5日
シェル芸について
kriw

活動の紹介

カテゴリ

タグ