行を消す
# 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行をパターンスペースに読み込む
- address にマッチするなら command を実行
- その結果を表示
アドレスの指定方法
# 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