私はWindowsを使用していますが、私の質問はまだここに正しく配置されていると思います。
C:\Users\User>grep --version
GNU grep 2.6.3
C:\Users\User>sed --version
GNU sed version 4.2.1
次の作業が行われることを確認しました(出力here
)。
echo here | grep -E "\w+"
echo here | grep -E "[her]+"
ただし、これは機能しません(何も出力されません)。
echo here | grep -E "[\w]+"
これにより、次のように出力されますhere
。
echo here | grep -P "[\w]+"
私はこれが[\w]
Perl正規表現にのみ当てはまると思います。そうですか?
それでは、話をしてみましょうsed
。これは動作します(出力gone
):
echo here | sed -r "s/\w+/gone/"
echo here | sed -r "s/[her]+/gone/"
繰り返しますが、これは次のようhere
に出力されません。
echo here | sed -r "s/[\w]+/gone/"
これで、sedのPerl正規表現をどのように有効にできますか?どのような方法がありますか?
答え1
さまざまなツールとそのバージョンは、さまざまな正規表現のバリエーションをサポートしています。各文書にサポートされている内容が記載されています。
標準は、すべての標準互換アプリケーションで利用可能な最小限の機能セットに依存するように存在します。
たとえば、POSIXで指定された基本正規表現のすべての最新の実装sed
と実装(少なくとも1つのバージョンまたは他の標準がありますが、ここ数十年間、この点では標準は大きく進歩していません)。grep
[:alnum:]
POSIX BREとEREには文字クラスがあります。これはそのロケールの文字と数字と一致します(a-zA-Z0-9
ロケールがCでない限り、通常はより多くの文字が含まれます)。
だから:
grep -x '[[:alnum:]_]\{1,\}'
1つ以上のalnumまたは_と一致します。
[\w]
POSIXには一致するバックスラッシュまたはが必要なため、使用可能または実装が見つかりませw
ん(非標準オプションを介している場合を除く)。grep
sed
POSIX は alone の動作を指定しないので、実装が望むことを行う\w
ことができます。 GNUはgrep
これをずっと前に追加しました。
GNUにはgrep
独自の正規表現エンジンがありましたが、現在はGNU libcエンジンを使用しています(独自のコピーが含まれています)。
そのロケールの数字と下線が一致するように設計されています。しかし、現在シングルバイト文字だけが一致するというバグがあります。たとえば、UTF-8ロケールでは明らかに文字にもかかわらず、éと一致せず、éが単一文字であるすべてのロケールで一致します。 e) 特徴).
\w
Perl regexpとPCREにも正規表現演算子があります。 PCRE / perlはPOSIX正規表現ではなく、まったく異なるものです。
これで、GNUがPCREを使用する方法によってgrep -P
PCREがない場合と同じ問題が発生します-P
。ただし、この問題は次の方法で解決できます(*UCP)
(非UTF8ロケールでは副作用もありますが)。
GNUはsed
また、GNU libcの正規表現を独自の正規表現として使用します。そのように使用しますが、GNUのようなバグはありませんgrep
。
GNUはsed
PCREをサポートしていません。コードには以前試したことがあるという証拠がありますが、もはや議題ではないようです。
Perlの正規表現が必要な場合はperl
butを使用してください。
sed
それ以外の場合は、/の特定の実装の虚偽の非標準機能に頼るのではなく、標準に固執してを使用してgrep
ください[_[:alnum:]]
。
答え2
あなたは正しいです。\w
PCREの一部であるPerl互換正規表現があります。しかし、これは「標準」正規表現の一部ではありません。http://www.regular-expressions.info/posix.html
一部のバージョンではsed
これをサポートできますが、最も簡単な方法はperl
フラグを指定してモードで使用することです。 (と)。 (詳細は参照sed
-p
-e
perlrun
)
ただし、この例ではこれを囲む必要はありません[]
。これはペイロードグループ用です。
echo here | perl -pe 's/\w+/gone/'
またはWindowsの場合:
C:\>echo here | perl -pe "s/\w+/gone/"
gone
C:\>echo here | perl -pe "s/[\w\/]+/gone/"
gone
バラよりperlre
PCREの詳細をご覧ください。
ここからPerlを得ることができます: http://www.activestate.com/activeperl/downloads
答え3
grep
私はこれが疑わしく、sed
適用時期[]
と拡張時期を異なる方法で決定しています\w
。 Perlでは、正規表現は\w
すべての単語文字を表し、[]
その中の文字を一致として適用するグループを定義します。\w
以前に「拡張」すると、[]
すべての単語文字の文字クラスになります。代わりに[]
、これを最初に実行すると、2つの文字を含む文字クラスが作成されるため、これら2つの文字のうちの1つ以上を\
含むw
すべてのパターンと一致します。
したがって、doなどの特殊シーケンスを尊重するのではなく、一致させる正確な文字を含むものとしてsed
扱うようです。もちろん、この例ではまったく必要ありませんが、これは重要な状況を想像することができますが、括弧とorを使用して機能するようにすることもできます。[]
\w
perl
grep
[]