sedコマンド
#2020.03 #新しいLinuxの教科書 #Linuxコマンド
sedとawk=テキスト編集のためのコマンド
sedは主に文字列の置換処理に使われる
awkは主に高機能なコマンドで条件分岐や変数も使える
sedとは?
非対話型エディタであり、メモ帳やVimなどの対話型エディタと大きく異なる(流れは以下の通り)
シェルから編集のためのコマンドを引数として与えてsedコマンドを実行する
sedコマンドは編集対象のテキストに対して与えられたコマンドに対応する編集操作を行う(画面上では見えない)
編集後のテキストをsedコマンドが標準出力に出力する
sedコマンドは編集結果を標準出力に出力するため、元のファイルは変更しない
sedはフィルタとして動作するため、ファイルの指定がない場合は標準入力から読み込まれる
これを利用してパイプを使って他のコマンドの出力結果を編集する目的でもよく使われる
sed オプション スクリプト 対象ファイル
スクリプト=アドレスとコマンドを組み合わせた文字列のこと
よく使うコマンド
d = 行を削除、p = 行を表示、s = 行を置換
sed で削除する
code:sedコマンド
vagrant 09:13:07 ~/work/example $ cat drink2.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeeeer!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
# 1行目を消す
vagrant 09:13:12 ~/work/example $ sed 1d drink2.txt
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeeeer!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
# 2〜5行目を消す
vagrant 09:14:43 ~/work/example $ sed 2,5d drink2.txt
Ber
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
# 3行目から最後まで消す
vagrant 09:15:02 ~/work/example $ sed '3, $d' drink2.txt
Ber
Beer
# dに引数を渡さなかったら全行削除(元のファイルの記述は残る)
vagrant 09:15:32 ~/work/example $ sed d drink2.txt
# 先頭がBで始まる行を削除(正規表現が使われている)
vagrant 09:15:43 ~/work/example $ sed /^B/d drink2.txt
My Vodka
My Wine
Wine Wine
WineWine
vagrant 09:16:06 ~/work/example $
sedで置換する
sed s/置換前文字列/置換後文字列/フラグ フラグは省略可
gフラグ=見つかった全ての文字列を削除
デフォルトは行で最初に見つかった文字列のみを置換する
code:sedの置換
# BeerをWhiskyに置換
vagrant 10:11:05 ~/work/example $ sed 's/Beer/Whisky/' drink.txt
Ber
Whisky
WhiskyBeer
WhiskyBeerBeer
Beeeeeeeeeeer!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
# gフラグで全ての文字を置換
vagrant 10:08:26 ~/work/example $ sed 's/Beer/Whisky/g' drink.txt
Ber
Whisky
WhiskyWhisky
WhiskyWhiskyWhisky
Beeeeeeeeeeer!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
# 正規表現を使った置換
vagrant 10:08:50 ~/work/example $ sed 's/B.*r/Whisky/' drink.txt
Whisky
Whisky
Whisky
Whisky
Whisky!!!
Whisky
Whisky
My Vodka
My Wine
Wine Wine
WineWine
# !を削除(空白で置換)
vagrant 10:09:09 ~/work/example $ sed 's/!//g' drink.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeeeer
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
# 置換した1行だけ表示
vagrant 10:14:38 ~/work/example $ sed -n 's/!//gp' drink2.txt
Beeeeeeeeeeer
sedでも拡張正規表現が使える
code:拡張正規表現
# -rオプションで拡張正規表現を使う
vagrant 10:14:42 ~/work/example $ sed -r 's/Be+r/Whisky/' drink2.txt
Whisky
Whisky
WhiskyBeer
WhiskyBeerBeer
Whisky!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
vagrant 10:15:13 ~/work/example $
後方参照
My のうしろを\( \) でグループ化した=ここでは任意の文字列が全て当てはまるので「My 〜」の〜の箇所を抜き出して/--\1--/ここの\1の中身に代入できる
\( \) の\は拡張正規表現では不要
code:後方参照
vagrant 10:20:15 ~/work/example $ sed 's/My \(.*\)/--\1--/' drink2.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeeeer!!!
Bear
Br
--Vodka--
--Wine--
Wine Wine
WineWine
vagrant 10:20:56 ~/work/example $
置換する位置を指定する
code:位置を指定する
vagrant 10:26:48 ~/work/example $ sed '1,3s/Beer/Whisky/g' drink2.txt
Ber
Whisky
WhiskyWhisky
BeerBeerBeer  # ここは1~3行目の指定されたアドレスの範囲外なので無視されている
Beeeeeeeeeeer!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
vagrant 10:27:10 ~/work/example $
実はsedコマンドのsのうしろの区切り文字はスラッシュ以外でもOK
スラッシュを置換する文字列内で使いたいときなどは!などに区切り文字を変更して記述する
以下の二つは全く同じ
code:区切り文字を変更
vagrant 10:27:54 ~/work/example $ sed 's/Beer/\/Beer\//g' drink2.txt
Ber
/Beer/
/Beer//Beer/
/Beer//Beer//Beer/
Beeeeeeeeeeer!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
vagrant 10:28:10 ~/work/example $ sed 's!Beer!/Beer/!g' drink2.txt
Ber
/Beer/
/Beer//Beer/
/Beer//Beer//Beer/
Beeeeeeeeeeer!!!
Bear
Br
My Vodka
My Wine
Wine Wine
WineWine
vagrant 10:28:27 ~/work/example $