よく使うPerlワンライナー

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

コメントを残す