私は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:]]
。