私たちが使えることを発見しました
perl -wnle "/RE/ and print"
例えば
perl -wnle "/^.{0,80}$/ and print"
または
grep -ri someText * | perl -wnle "/^.{0,80}$/ and print"
80文字を超える行を除外します。
しかし、Bashでエイリアスとしてどのように設定しますか?
私は試した:
alias pgrep='perl -wnle "/$1/ and print"'
それから
grep -ri someText * | pgrep "^.{0,80}$"
しかし、それは言うでしょう
Can't open ^.{0,80}$: No such file or directory.
答え1
alias
bash
はいいいえパラメータを受け入れるように設計されており、パラメータが指定されている場合は、どのように処理するかわかりません。通常は避けてください。非常に単純なコマンド名の置換にのみ使用してください。
代わりに機能を使用することをお勧めします。これはpgrep
有効なLinuxバイナリなので、使用しないでください。明示的な名前を使用することをお勧めします。
perlgrep() {
perl -wnle "/$1/ and print"
}
今電話してください
perlgrep '^.{0,80}$'
しかし、エラーが発生する理由は、パラメータalias
自体を渡すことができないため、拡張が発生するとコマンドは次のようになるためです。
grep -ri someText * | perl -wnle "/$1/ and print" '^.{0,80}$'
perl
これは'^.{0,80}$
、開いて正規表現を実行する必要があるファイル名で処理されるため、間違っています。
答え2
参考にしてくださいpcregrep
(〜PCREライブラリ)とGNU grep -P
(PCREサポートで構築されている場合)はPerlと同様の正規表現を使用し、grep -P
UTF-8ロケールでUTF-8データを正常に処理できます。
これを使用するには、perl
これを実行するスクリプトまたは関数を定義できます。エイリアスはエイリアスにすぎないため、ある文字列を別の文字列に置き換えても機能しません。
次のことができます。
perlgrep() (
export RE="${1?}"; shift
exec perl -Mopen=locale -Twnle '
BEGIN {$ret = 1; $several_files = @ARGV > 1}
if (/$ENV{RE}/) {
$ret = 0;
print $several_files ? "$ARGV: $_" : $_
}
END {exit $ret}' -- "$@"
)
しかし注意してください。perl -n
任意のファイル名に対する実行効果上記のオプションは、これらの問題を部分的にのみ軽減します-T
。
また、を使用して-Mopen=locale
ロケールの文字セットに従って入力をデコードし、出力をエンコードしますが、ファイル名自体は次のようになります。コード化しかし、デコード済みつまり、ファイル名のバイト値が127より大きい場合、ロケールの文字セットがiso8859-1でなければ機能しません。
最後に、あなたはただ必要ですデコード入力ラインマッチングにのみ使用されます。再エンコードする必要もなく、ファイル名をデコード/エンコードする必要もありません。
したがって、最新バージョンではperl
次のことができます。
#! /usr/bin/perl --
use warnings;
use strict;
use Encode::Locale;
use Encode;
my $re = shift @ARGV;
my $several_files = @ARGV > 1;
my $ret = 1;
while (<<>>) {
if (decode(locale => $_) =~ $re) {
$ret = 0;
print $several_files ? "$ARGV: $_" : $_
}
}
exit $ret;
パラメータからの任意のコード挿入を防ぐために、(?{code})
同じ正規表現演算子が無効になります。必要に応じて(??{code})
このスクリプトの上部に追加できます。use re 'eval';