sed 正規表現で [\w]+ を使用する方法は?

sed 正規表現で [\w]+ を使用する方法は?

私は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ん(非標準オプションを介している場合を除く)。grepsed

POSIX は alone の動作を指定しないので、実装が望むことを行う\wことができます。 GNUはgrepこれをずっと前に追加しました。

GNUにはgrep独自の正規表現エンジンがありましたが、現在はGNU libcエンジンを使用しています(独自のコピーが含まれています)。

そのロケールの数字と下線が一致するように設計されています。しかし、現在シングルバイト文字だけが一致するというバグがあります。たとえば、UTF-8ロケールでは明らかに文字にもかかわらず、éと一致せず、éが単一文字であるすべてのロケールで一致します。 e) 特徴).

\wPerl regexpとPCREにも正規表現演算子があります。 PCRE / perlはPOSIX正規表現ではなく、まったく異なるものです。

これで、GNUがPCREを使用する方法によってgrep -PPCREがない場合と同じ問題が発生します-P。ただし、この問題は次の方法で解決できます(*UCP)(非UTF8ロケールでは副作用もありますが)。

GNUはsedまた、GNU libcの正規表現を独自の正規表現として使用します。そのように使用しますが、GNUのようなバグはありませんgrep

GNUはsedPCREをサポートしていません。コードには以前試したことがあるという証拠がありますが、もはや議題ではないようです。

Perlの正規表現が必要な場合はperlbutを使用してください。

sedそれ以外の場合は、/の特定の実装の虚偽の非標準機能に頼るのではなく、標準に固執してを使用してgrepください[_[:alnum:]]

答え2

あなたは正しいです。\wPCREの一部であるPerl互換正規表現があります。しかし、これは「標準」正規表現の一部ではありません。http://www.regular-expressions.info/posix.html

一部のバージョンではsedこれをサポートできますが、最も簡単な方法はperlフラグを指定してモードで使用することです。 (と)。 (詳細は参照sed-p-eperlrun)

ただし、この例ではこれを囲む必要はありません[]。これはペイロードグループ用です。

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

バラよりperlrePCREの詳細をご覧ください。

ここからPerlを得ることができます: http://www.activestate.com/activeperl/downloads

答え3

grep私はこれが疑わしく、sed適用時期[]と拡張時期を異なる方法で決定しています\w。 Perlでは、正規表現は\wすべての単語文字を表し、[]その中の文字を一致として適用するグループを定義します。\w以前に「拡張」すると、[]すべての単語文字の文字クラスになります。代わりに[]、これを最初に実行すると、2つの文字を含む文字クラスが作成されるため、これら2つの文字のうちの1つ以上を\含むwすべてのパターンと一致します。

したがって、doなどの特殊シーケンスを尊重するのではなく、一致させる正確な文字を含むものとしてsed扱うようです。もちろん、この例ではまったく必要ありませんが、これは重要な状況を想像することができますが、括弧とorを使用して機能するようにすることもできます。[]\wperlgrep[]

関連情報