- Contents -
sed, awk だと、Macで微妙にオプションが違ったりで、環境に依存する事があるので、
Perlを代わりに使うようにしています。
Cygwinにもデフォルトで入っているし。
ガッツリPerlで書くというよりも、用途としてはワンライナーで書くだけかな。
だって、Perlで書いたコードは正直、あとで自分でも理解できなくなるくらい省略記法が満載で。。
ワンライナーで使うくらいが、ちょうどよい使い方なんじゃないかと思っています。
Evernoteに、メモしていたものを一旦まとめて
ワンライナーでよく使うスニペットを載せます。
オプションについて
option | 説明 |
---|---|
-e | 引数でperlコードを指定 |
-n | 行毎に処理だけする (マッチする行だけ出力するときなどにつかう) |
-p | 行毎に処理して出力 (置換して出力するときなどにつかう) |
-l | printに勝手に改行をつける |
-a | 行をカラムに分割する。@Fという配列にセットします (awkのカラム取得のようにつかえる) |
-F | -aオプションで分割時の区切り文字)を指定できる |
-i | ファイルを編集して、バックアップを作成します。 (sedと似た感じ) |
特殊な変数
$_: 暗黙変数 (行毎の文字列がはいる。この変数は省略する事ができる)
スニペット
grepみたいにつかう
cat sample.txt | perl -nle 'print if /hoge/'
# 上記の元の記述
cat sample.txt | perl -nle 'if ($_ =~ /hoge/) { print $_ }'
# ifの処理文が単一なら、前方に持ってくる事ができる
cat sample.txt | perl -nle 'print $_ if ($_ =~ /hoge/)'
# $_は省略できる。
cat sample.txt | perl -nle 'print if (/hoge/)'
置換
cat sample.txt | perl -pe 's/hoge/piyo/g;'
# 複数書くことも出来る
cat sample.txt | perl -pe 's/hoge/piyo/g; s/foo/bar/g;'
# 括弧で囲った部分だけ抽出 \1 または、$1
cat sample.txt | perl -pe 's/hoge(piyo)/\1/g;'
# バックアップを作成して置換
# btest.txtファイルに含まれる"abc"という文字列を"ABC"に置換え、
# test.txt.bakというバックアップファイルを作成します。
perl -i".bak" -pe 's/abc/ABC/g' test.txt
フィールドの抽出
cat sample.txt | perl -alne 'print $F[0]'
BEGIN(初期処理) と END(終了処理)
cat sample.txt | perl -ple '
BEGIN{ print "hoge" }
END{ print "piyo" }
'
比較ファイルの差分抽出
# a,b 共通な行を出力 ※ソート済みで重複行を含まない事
perl -nle '$l{$_}++;END{$l{$_}>1 and print for keys %l}' a.txt b.txt
# bにだけある行を出力 ※ソート済みで重複行を含まない事
perl -nle 'if(@ARGV){$l{$_}++}else{print unless $l{$_}}' a.txt b.txt
文字コードの変換
# shift-jis を、utf-8 に変換
cat sample.txt | perl -MEncode -pe 'Encode::from_to($_,"shiftjis","utf-8");'
参考URL
http://qiita.com/takc923/items/8654d69008e921c9c9fb
http://hachiojipm.github.io/entry/2013-09-16-perlonechar.html