私は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正規表現をアクティブにするにはどうすればよいですか?
さまざまなツールとそのバージョンは、正規表現のさまざまなバリアントをサポートしています。それぞれのドキュメントには、それらのサポート内容が記載されています。
標準が存在するため、準拠するすべてのアプリケーションで使用できる最小限の機能セットに依存できます。
たとえば、sed
とgrep
の最新の実装はすべて、POSIXで指定された基本正規表現を実装します(少なくとも1つのバージョンまたは他のバージョンの標準ですが、その標準はそれほど進化していません。過去数十年で考慮してください)。
POSIX BREおよびEREでは、[:alnum:]
文字クラスがあります。これは、ロケールの文字と数字に一致します(ロケールがCでない限り、a-zA-Z0-9
より多くのものが含まれていることに注意してください)。
そう:
grep -x '[[:alnum:]_]\{1,\}'
1つ以上のalnumまたは_と一致します。
[\w]
は、POSIXでバックスラッシュまたはw
と一致するために必要です。そのため、それが利用可能なgrep
またはsed
実装は見つかりません(非標準オプションを使用しない限り)。
\w
のみの動作はPOSIXでは指定されていないため、実装は必要なことを実行できます。 GNU grep
がずっと前に追加した。
GNU grep
には以前は独自の正規表現エンジンがありましたが、現在はGNU libcのものを使用しています(独自のコピーを埋め込んでいます)。
これは、ロケールのアルナムとアンダースコアに一致させることを目的としています。ただし、現在のところ、シングルバイト文字のみに一致するというバグがあります(たとえば、UTF-8ロケールでは、それが明らかに文字であり、éが単一のすべてのロケールでéに一致する場合でも、キャラクター)。
また、Perl regexpとPCREには\w
regexp演算子があります。 PCRE/PerlはPOSIX正規表現ではありません。これらは完全に別のことです。
GNU grep -P
はPCREを使用するため、-P
を使用しない場合と同じ問題が発生します。ただし、(*UCP)
を使用することで回避できます(ただし、UTF8以外にも副作用があります)ロケール)。
GNU sed
もGNU libcの正規表現に独自の正規表現を使用します。GNU grep
。
GNU sed
はPCREをサポートしていません。コードには以前に試みられたいくつかの証拠がありますが、それはもはや議題に含まれていないようです。
Perlの正規表現が必要な場合は、Perl
を使用してください。
それ以外の場合は、sed
/grep
の特定の実装の偽の非標準機能に依存するのではなく、標準に固執し、[_[:alnum:]]
を使用する方が良いと思います。
あなたは正しいです - \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
PCREの詳細については perlre
を参照してください。
ここでPerlを入手できます: http://www.activestate.com/activeperl/downloads
grep
とsed
は、[]
をいつ適用するか、および\w
をいつ展開するかによって決定が異なると思います。 Perlの正規表現では、\w
は任意のWord文字を意味し、[]
はグループを定義して、一致する文字を適用します。 \w
の前に[]
を「展開」すると、すべてのWord文字の文字クラスになります。代わりに最初に[]
を実行すると、2つの文字\
とw
の文字クラスが作成され、これらの2つの文字の1つ以上を含むすべてのパターンに一致します。
したがって、sed
は[]
を認識しており、特殊なシーケンス\w
をPerl
やgrep
do。もちろん、この例では[]
は完全に不要ですが、それが重要であるケースを想像できるかもしれませんが、それを括弧やORで動作させることもできます。