sed簡単整理1 - 基本 -

簡単な変換はsedで、複雑な変換はawkというようにしていましたが、
sedawkぐらいのことができると分かったので、整理してみます。
sedperlっぽくて私にはawkの方が使いやすかったですが、
少しいじってみたら、sedの方が簡潔でよかったです。
状況次第でsedawkを使い分けたら、効率があがりそうです。

使い方

sed -e '処理内容' ファイル名
# 正規表現を使いたい場合、-rを付ける。
# 普段はリダイレクト(>)で別のファイルに出力し、原本は残すが、原本を修正したい場合は-iを付ける。

処理内容

アドレス+コマンド+コマンドパラメータ

アドレス

行番号又は文字列又は正規表現正規表現を使う時は-rオプションが必要。

1,5 : 1行目から5行目まで 
1~5 : 1行目から5行おき(1, 6, 11...)5,$ : 5行目から最後の行まで。
/apple/ : appleがある行。
/apple/,/pie/ : appleからpieまで。

コマンド

s, d, i, N, H, h, pなどがある。
各コマンドの前に!が付くと、逆の意味になる。

コマンドパラメータ

s/apple/pie/  #sコマンドのコマンドパラメータはappleとpie。
4asuper! #aコマンドのコマンドパラメータはsuper!。

sコマンド

置換。

cat << EOF > sed_test.txt
a apple haha
b apple hihi
c apple hopi
d man ama
e kkk appp
f apple mamo
g apple nami
abc apple !!
wow happy new year, duke!
EOF

sed -e '1,5s/apple/pie/g' sed_test.txt
# 1行目から5行目までのappleをpieに置換。
# 結果
# a pie haha
# b pie hihi
# c pie hopi
# ...

sed -r -e 's/happy.+year/>&</g' sed_test.txt
# &はパターンにマッチした文字列(下記の場合、happy new year)。
# 正規表現なので、-rオプションがついた。
# 結果
# ...
# wow >happy new year<, duke!

sed -e '/abc/s/apple/pie/g' sed_test.txt
# abcがある行のappleをpieに変換。
# 結果
# ...
# abc pie !!
# ...

dコマンド

削除。

sed -e '5d' sed_test.txt
#5行目を削除。

sed -e '5!d' sed_test.txt
#5行目以外を削除。

iコマンド

指定した行に文字列を挿入。

sed -e '4isuper!' sed_test.txt
# 4行目にsuper!を挿入。
# 結果
# a apple haha
# b apple hihi
# c apple hopi
# super!
# ...

aコマンド

指定した行の後ろに文字列を追加。

sed -e '4asuper!' sed_test.txt
# 4行目の後ろ(つまり、5行目)にsuper!を挿入。
# 結果
# a apple haha
# b apple hihi
# c apple hopi
# d man ama
# super!
# ...

Nコマンド

次の行を先読みする。複数の行をまとめて処理する時に利用できる。

sed -e 'N;N;s/\n/,/g' sed_test.txt
# 3行ずつ(基本1行 + N(次の1行) + N(次の1行))読み込んで、コンマでつなげる。
# 最後のgはglobal。マッチした全ての文字列を置換するという意味。これがないと1行目のみ置換される。
# 結果
# a apple haha,b apple hihi,c apple hopi
# d man ama,e kkk appp,f apple mamo
# g apple nami,abc apple !!,wow happy new year, duke!

H, h, p

ホールドスペース・パターンスペースに関連するコマンド。
sed簡単整理2に整理する予定。複雑な処理に使える。