
私は UNIX シェル スクリプトで正規表現を使用する簡単な方法を探しています。すべてのシステムで Perl 拡張機能が grep に組み込まれているわけではありません。ここで Perl 正規表現が本当に役立つのは、後方参照と前方参照ですが、これを sed で効果的に使用する方法が見つかりませんでした。私はすぐに次の 1 行を思いつきました。
tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'
Q1. これは Perl で作業を行う安全な方法ですか? Q2. 代わりにスクリプト全体を Perl で記述するほうがよいでしょうか?
答え1
Perl スニペットがなぜこのように記述されているのかわかりません。スクリプト内に直接正規表現を記述することもできます。
perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'
これにより、オプションを活用できるようになります-n
(ボーナスとして、入力エラーが発生した場合に適切なエラー レポートを取得できます)。さらに、Perl の慣用句を使用します。
perl -ne 'print if /my regex/'
Sed には後方参照がありますが、Perl の拡張正規表現の方が強力で、sed ではできないことがあります (sed には完全な正規表現すらありません。代替は\|
標準機能ではありませんが、多くの実装にはあります)。
従来のツールでできることのほとんどは、Perlでも簡単にできます。たとえば、最初のK-1バイトをスキップしたい場合は、次のように記述します。
perl -ne 'BEGIN {read ARGV, "", 42-1}; …'
移植性が必要な場合、多くのテキスト処理タスクを awk で実行できますが、awk にはバックリファレンスがまったくないため、文字列からテキストを抽出するのが面倒になる可能性があります。