純粋に正規表現を使用するためにシェルスクリプトをPerlで補完するのは良い考えですか?

純粋に正規表現を使用するためにシェルスクリプトをPerlで補完するのは良い考えですか?

私はすべてのシステムがgrepに組み込まれたPerl拡張子を持っていないUNIXシェルスクリプトで正規表現を使用する簡単な方法を探しています。ここで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には逆参照がまったくないため、文字列からテキストを抽出するのは苦手です。

関連情報