feature image

2017年11月12日 | ブログ記事

sedについて調べてみた。

この記事は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 icon
この記事を書いた人
kriw

CTFを少しやっています。

この記事をシェア

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

関連する記事

2017年11月14日
IBIS2017参加報告
Keijan icon Keijan
2017年11月17日
そばやのワク☆ワク流体シミュレーション~MPS編~
sobaya007 icon sobaya007
2017年12月26日
RustでMCMC(Metropolis-Hasting)
David icon David
2017年12月13日
チズケ破壊論
whiteonion icon whiteonion
2017年12月1日
WaltZ
Double_oxygeN icon Double_oxygeN
2017年11月4日
文章をよしなに分散表現しよう
David icon David
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記