Macにもsedは入っているようなんだけど、Linuxのsedと由来が違うようで使いにくいらしい。ということで、Homebrewでgnuのsedをインストールした。
$ brew install gnu-sed
これで、gsed
コマンドが使えるようになる。Macだとこれにしておけば良さそう。
sedとは
コマンドラインでテキストを色々操作できるコマンド。
基本操作
$ gsed -e '3d' names.txt
3行目を削除して標準出力に表示する。
$ gsed -i.bak '3d' names.txt
3行目を削除してファイルを更新する。その際に、-iに.と拡張子名をつけておくと、バックアップファイルを作成してくれる。
ファイルから実行
- 3dとだけ記述して、ex1.sedという形式で保存。
gsed -f ex1.sed
とすると、ファイルの条件で処理を実行する。
パターンスペース
3d: addressとcommandの合成 => 3行目をdする
1行1行下記の処理を行っている。
- fileから1行読み込んでパターンスペースに格納
- addressにマッチするか確認し、マッチしたらcommandを実行
- パターンスペースを表示する
-n
オプションをつけると最後の表示をしないようにできる。
アドレス
3d
: 3行目削除(以下略)3!d
: 3行目以外1d;3d
: 1行目と3行目を削除1,3d
: 1行目から3行目を削除(範囲)1~2d
: 1行目から2飛ばしで削除3,$d
: 3行目から最後の行まで削除/i$/d
: iが最後のものだけ削除(正規表現)- アドレスを削除すると全ての行に対して実行する
コマンド
d
: deletep
: printq
: quit その行で処理を終了させるi
: inserta
: appendy
: 文字の置換s
: 文字列の置換
$ gsed '1i\tsuika' names.txt
1行目に文字を挿入する。
$ sed 'y/t/T/' names.txt $ sed 'y/to/TO/' names.txt # t->, o->O 順番が対応している
(全ての行に対して)tをT(oをO)に置き換える。
$ gsed 's/dadada/HONDA/' names.txt # -> 1つ目だけ行う $ gsed 's/dadada/HONDA/g' names.txt # -> 全てに対して行う $ gsed 's/dadada/HONDA/2' names.txt # -> 2番目だけに対して行う $ gsed 's/dadada/HONDA/ig' names.txt # -> 全てに対して大文字小文字関係なく行う $ gsed 's/[d]adada/HONDA/g' names.txt # -> 正規表現も使える $ gsed 's/[0-5]/【&】/' names.txt # -> マッチしたものの前後に何かしたい $ gsed 's/\([0-5]\) \(.*\)/\2 【\1】/' names.txt # -> 括弧の塊ごとに処理をする
dadadaをHONDAに置き換える。
ホールドスペース
パターンスペースを拡張した概念。
h
: パターンスペースをホールドスペースにするg
: ホールドスペースをパターンスペースにするx
: 交換する