へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)! #vZkt8fc6J

コマンドからの複数行置換について。〜え、sedって1行ずつしか置換してくれないの?〜

はじめに

f:id:haruharu1:20150603211803p:plain
Nothing is happend.

sedはどうやらファイルの中身を1行ずつ読み込んでいるらしい。
grepもしかりだ。

そこでぼくはperlをつかった

$ perl -0777 -pe "s/a\n\b/xxx/g" grep.txt
f:id:haruharu1:20150603212137p:plain

perlは偉大ダナー

もちろんsedと同じように-iをつければ上書き保存してくれるぞッ
f:id:haruharu1:20150603212353p:plain

コマンドの意味について

Perl知らないから、$ perldoc perlintroして1時間程度学習したあと、
$ perldoc perlrunをしていると、-0のオプションが出てきた。
どうやらデリミタ(delimiter、変数は$/)を指定しているらしい。meterじゃなくてmiter。
普段はデリミタはnullが入っている。

777を指定している理由は、慣習的な理由だから、あんまり意味はない。400以上ならなんでもいいみたいだ。

要は$ cut -d ここと同じだ。
8進数か16進数で指定する。16進数のときは0x100以上を指定すると怒られる。

これはaを改行のようにみなしたときの例。
f:id:haruharu1:20150603214425p:plain

そういえばいい忘れてたけど、s/ほにゃらら/ほんわか/ggは、その行全部に対して置換するよという意味。
まぁこれはsedだけじゃなくてvimでも出てくるから、馴染み深いはずだ。
みんなvim使えばいい。

厳密には「行」ではなくてそれぞれの要素(インスタンス)に対してという感じ。

6だって改行の代わりになる。下は、デリミタを何も指定していない例。
f:id:haruharu1:20150603214753p:plain

「改行が出ても置換始めないけど、6が出たら置換する」というときに便利そうだ(あんまり使い道ない

16進数とアスキーコード

f:id:haruharu1:20150603215140p:plain
0x20がスペース
0x30から0x39までが数字
0x41からがアルファベット大文字
0x61からがアルファベット小文字
というのはなんとなくみんな覚えてるはずなので、あんまり苦にならない感じだ。
これでぼくもバイナリアン

けつ

とりあえずperlsedとかのように便利だということがわかったので、コマンドラインとかでシェルスクリプトめんどくさいときに使っていきたいと思う。
awkも覚えた方がいいのかな。

画像で貼っているせいでコピペできないのは仕様です。

おまけ:複数行置換ってどういうときに便利なの?

コピペされたコードをまとめるとき。

自分用おまけ

grep "foobar" **/*.py | 
cut -d ":" -f 1 |
xargs -n 1 -I@ perl -i -0777 -pe "s/foo/piyo/g" @