突っ走り書き

見せるほどのものでは..

sed のまとめ

行を消す

# 3行目を消す
$ sed -e '3d' input.txt
  • -e は "expression" の略
  • 処理の内容が1つのときは -e は省略できる

上書きとバックアップ

# input.txt に処理内容を上書き
$ sed -i '3d' input.txt

# input.txt.org という名前でバックアップをとる
$ sed -i.org '3d' input.txt

処理内容をファイルに記述する

# 処理内容を記述したファイル
$ cat del.sed
3d
$ sed -f del.sed input.txt

用語

アドレスとコマンド
  • address: どの行に処理をするか
  • command: どのような処理をするか

例えば,'3d' なら「3行目を delete せよ」という意味.

sedの処理
  1. ファイルの1行をパターンスペースに読み込む
  2. address にマッチするなら command を実行
  3. その結果を表示

アドレスの指定方法
# 3行目以外を削除
$ sed '3!d' input.txt

# 3行目と4行目を削除
$ sed '3d;4d' input.txt

# 1行目から3行目を削除
$ sed '1,3d' input.txt

# 1行目から2つおきに削除
$ sed '1~2d' input.txt

# 3行目から最後の行($で表す)までを削除
$ sed '3,$d' input.txt

# 正規表現を使ってアドレスを指定
# 行末が "a" である行を削除
$ sed '/a$/d' input.txt

# アドレス指定を省略すると全ての行を処理する
$ sed 'd' input.txt

コマンドいろいろ

p (= print) コマンド
# 3行目を2回表示
$ sed '3p' input.txt

# 3行目だけを表示
$ sed -n '3p' input.txt

q (= quit) コマンド
# 3行目で処理を終了
$ sed '3q' input.txt

i (= insert) / a (= append) コマンド
# 1行目の上に行を追加
sed '1i\---begin---' input.txt

# 最終行の下に行を追加
sed '$a\---end---' input.txt

# 複数指定をして begin/end で挟む
sed -e '1i\---begin---' -e '$a\---end---' names.txt

y コマンド:1文字ずつの置換
# 全ての行に対して a -> A 実行
$ sed 'y/a/A/' input.txt

# a -> A に,b -> B に置換
$ sed 'y/ab/AB/' input.txt

s コマンド:文字列の置換
  • s/[before]/[after]/[flag]
# 置換:dog -> inu を実行
$ sed 's/dog/cat/' input.txt

# gフラグは条件に(行単位で)当てはまる全てを置換する
$ sed 's/dog/cat/g' input.txt

# nフラグは(行単位で)n番目のみ置換
$ sed 's/dog/cat/2' input.txt

# 大文字と小文字を区別しない
$ sed 's/dog/cat/i'  input.txt

# フラグは複数指定可
# 大文字小文字の区別をしないで,全てを置換
$ sed 's/dog/cat/ig' input.txt

# 正規表現も使える
$ sed 's/[dD]og/cat/' input.txt

# マッチした部分は & で表す
# 例として数字を [ ] で囲む処理
# 直前の文字の1回以上の繰り返しは \+ と書くことに注意
$ sed 's/[0-9]\+/[&]/' input.txt

# マッチした文字列の部分文字列を使う
# \(...\) で囲った箇所を \1, \2,... で呼び出す
$ cat num.txt
1 one
2 two
3 three
$ sed 's/\([0-9]\) \(.*\)/\2 -> \1/' num.txt
one -> 1
two -> 2
three -> 3