sedコマンド触ってみた


はじめに

sed コマンドって見たことあるけど実際に自分で使ったことないな。。。
ファイルや標準出力を編集するコマンドのようだけど・・・

と思ってお勉強した次第です

基本

・引数で指定したファイルに対してスクリプトで指定した操作(挿入や置換など)を行い、その結果を標準出力に出力する
・リダイレクトすればファイルに出力することも可能
・引数の対象ファイルを省略した場合は、標準入力が処理対象になる

$ sed [-オプション] スクリプト [対象ファイル]

文字列の置換

・基本
※置換前文字列/置換後文字列がスペースを含む場合は""でくくらないと複数文字列とみなされて怒られるのでくくること

$ sed s/置換前文字列/置換後文字列/ ファイル

# sample.txtで一番最初のtestをTESTに置換する
例)$ sed s/test/TEST/ sample.txt

・すべてを置換したい
上記だと一番最初に見つかった置換対象だけを置換するので、対象をすべて置換したい場合はおしりにgをくっつける

$ sed s/置換前文字列/置換後文字列/g ファイル

# sample.txt内すべてのtestをTESTに置換する
例)$ sed s/test/TEST/g sample.txt

・指定した部分を置換したい
s(スクリプトコマンドというらしい)の前にgrepとかで使う正規表現(パターン)か行番号を指定する
パターンを使用する際は//で囲む

# 行番号を指定する場合
$ sed 行番号s/置換前文字列/置換後文字列/ 対象ファイル

# sample.txt4行目のtestをbigloooooveに置換
例)$ sed 4s/test/biglooooove/ sample.txt

# sample.txt2~5行目に含まれるniceをgoodに置換
例)$ sed 2,5s/nice/good/ sample.txt

# パターンを指定する場合
$ sed /パターン/s/置換前文字列/置換後文字列/ 対象ファイル

# sample.txtにhiを含む行にhelloがあったらhow are youに置換する
例)$ sed /hi/s/hello/"how are you"/ sample.txt

文字列(行)の追加、挿入

・基本
※追加は指定した行の後ろに追加される
※挿入は指定した行の前に挿入される
※ファイルの最終行は$で表す。(エスケープ必要)

$ sed 追加したい行a 追加したい文字列 対象ファイル
$ sed 挿入したい行i 挿入したい文字列 対象ファイル

# sample.txt3行目の後ろにgoodbyを追加する
例)$ sed 3agoodby sample.txt

# sample.txt3行目の前にgoodbyを挿入する
例)$ sed 3igoodby sample.txt

# 末尾にtheEndを追加する
例)$ sed \$atheEnd sample.txt

# 末尾1つ前にtheEndを挿入する
例)$ sed \$itheEnd sample.txt

・1か所に複数行を追加・挿入したい
\nで区切って追加・挿入する

$ sed 追加したい行a 追加したい文字列\n追加したい文字列 対象ファイル
$ sed 挿入したい行i 挿入したい文字列\n挿入したい文字列 対象ファイル

# sample.txt3行目の下にgoodbyとgoodmorningを追加する
例)$ sed 3agoodby\ngoodmorning sample.txt

# sample.txt3行目の前にgoodbyとgoodmorningを挿入する
例)$ sed 3igoodby\ngoodmorning sample.txt

・複数個所に追加・挿入したい
-eで複数書く

$ sed -e 追加したい行a追加したい文字列 -e 追加したい行a追加したい文字列 対象ファイル

$ sed -e 挿入したい行i挿入したい文字列 -e 挿入したい行i挿入したい文字列 対象ファイル

# sample.txt3行目の下にgoodby、5行目の下にgoodmorningを追加
例)$ sed -e 3agoodby -e 5agoodmorning sample.txt

# sample.txt3行目の前にgoodby、5行目の下にgoodmorningを挿入
例)$ sed -e 3igoodby -e 5igoodmorning sample.txt

文字列の削除

・基本

$ sed 削除したい行d

# sample.txt3行目を削除
例)$ sed 3d sample.txt

# sample.txt5~10行目を削除
例)$ sed 5,10d sample.txt

・パターンに合致する箇所を削除
正規表現が使える

$ sed /パターン/d

# sample.txtのniceを含む行を削除
$ sed /nice/d sample.txt

勉強してみて

一旦基本のここまでにしますが、もっと複雑なこともできるようですね。。。
難しい、、、精進します。。