正規表現を使用するためだけに、シェル スクリプトを Perl で補足するのは良い考えでしょうか?

正規表現を使用するためだけに、シェル スクリプトを Perl で補足するのは良い考えでしょうか?

私は 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 にはバックリファレンスがまったくないため、文字列からテキストを抽出するのが面倒になる可能性があります。

関連情報