ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

perl をワンライナーで使ってテキスト編集する方法

簡単なテキストの編集をする場合、よく使うけどすぐに忘れてしまう perl のワンライナーについて、備忘録としてここにまとめようと思います。

perl ワンライナー覚書

オプション

[-e <処理>]:コマンドラインのプログラムとして実行

perl コマンドに「-e」オプションを使用すると、''で囲った処理が実行できます。
練習として「Hello world.」と表示させてみます。

$ perl -e 'print "Hello world.\n";'
Hello world.
[-l]:行末処理

このままでは、改行コードを意識しないといけないので「-el」というオプションを使用します。
「-le」にすると"\n"という改行コードが省略可能です。

$ perl -le 'print "Hello world.";'
Hello world.
[-E <処理>]:コマンドラインのプログラムとして実行

「-e」オプションに似ていますが、以下と同等の効果が付加されてます。

use feature 'current_sub', 'bitwise', 'evalbytes', 'fc', 'postderef_qq', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval'; 

「-E」オプションを使用すると「say」コマンドが使用できるので改行などの行末処理を意識しなくてすみます。

$ perl -E 'say "Hello World."'
Hello World.
[-n]:ループ処理
$ cat sample01.csv | perl -ne print
apple, 5
orange, 4
banana, 2
strawberry, 10

Perl の特殊変数

変数 説明
$. 現在の行番号
$! エラーの内容
$_ デフォルト変数
$^O OS名を取得
$$ プロセスID
$^T エポック秒でプロセスの開始時刻
OS 名表示
$ perl -E 'say "$^O"';
linux
エポック秒を日時に変換
$ perl -E 'say "$^T"'|perl -pe 's/\d+/localtime $&/e'
Tue Dec  8 20:47:17 2020

よく使うワンライナー

jpeg/jpgの拡張子を統一

{{target_dir}}は画像が保管されているフォルダに差し替えます。

$ find {{target_dir}}} -type f -name \*.jpeg | perl -nle '$o=$_;s/\.jpe?g/.jpg/; rename $o,$_'
csvファイルの内容について合計値を算出
$ cat sample01.csv
apple, 5
orange, 4
banana, 2
strawberry, 10

$ cat sample01.csv |perl -F, -lane '$sum += $F[1]; END {print $sum}'
21