awk: エラー: \{\} のテント

awk: エラー: \{\} のテント

メールアドレスを検索するには、次の正規表現を使用しています。

echo "[email protected]" | awk '/^([a-zA-Z0-9_-.\+]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$/ {print $0}'

しかし、エラーが返されます。

 awk: cmd. line:1: error : tent of \{\}

答え1

ショートバージョンは以下を使用してください。

$ echo "[email protected]" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'

実際のエラーメッセージが次のようになるとします。

awk: cmd. line:1: error: Invalid range end: …

もしそうなら、あなたは4つの質問をするでしょう:

  1. ダッシュ(-)は、明示的なダッシュではなく「文字範囲」を意味します。

    このエラーメッセージは、-文字範囲(_および).内のダッシュ()を囲む2文字が(ASCII)順序ではないために発生します。文字範囲では.-_エラーは発生しません。しかし、「文字範囲」(.ドットとアンダースコアの間のすべての文字)を意味するわけではありませんが、_明示的なダッシュ()と一致させようとしています-

    「角かっこ式」内で明示的なダッシュを一致させるには、ダッシュを範囲の最初または最後の文字にする必要があります。誰でも[-…][…-]。または落胆してそれから逃げなさい\-。つまり、次の両方が機能します。

    [-a-zA-Z0-9_.+]
     [a-zA-Z0-9_.+-]
    

    しかしいいえ、バックスラッシュはいいえダッシュを明示的にする一般的なソリューションです。努力する:

    $ echo 'ab-cd' | grep -Eo '[a\-c]+'
    ab
    c
    

    grep regex(拡張:含む)は-Eダッシュと一致しません。

  2. 「角かっこ式」の中にあるものは+特別ではないので、エスケープする必要はありません(「角かっこ式」内でエスケープするのは悪い習慣です)。これを使用してください:

    ^([-a-zA-Z0-9_.+]+)@
    
  3. ドットは、.「改行文字を除くすべての文字と一致する」特殊文字です。
    したがって、これをエスケープするか、\.「角かっこ式」を使用して[.]ドット文字を明示的に一致させる必要があります。以下を使用してください。

    ^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
    
  4. 最後に、「インターバル式」は歴史的な awk 実装の拡張であり、すべての awk で動作するわけではありません。これは一般的に「問題ではありません」。ただし、問題がある場合は、以下を使用する必要があります。

    ([a-zA-Z][a-zA-Z][a-zA-Z]?[a-zA-Z]?[a-zA-Z]?)$
    

ただし、GNU awkを使用している可能性があり、正しい構文は次のとおりです。

$ echo "[email protected]" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'

答え2

答え:

echo "[email protected]" | awk '/^([-a-zA-Z0-9_.\+]+)@([-a-zA-Z0-9_.]+).([a-zA-Z]{2,5})$/ {print $0}'
[email protected]

説明する: この文字の位置-は間隔を表すことができるのであいまいです。正規表現の先頭に移動またはエスケープすると正常に動作します。

追加情報: 正規表現が機能していることを確認してください。ウェブサイトわからないときは。


正しく指摘したようにイサク、式の最後の点は思うように動作しません。.すべての文字を表し、文字通りの点を表すにはエスケープする必要があります。\.

追加の最適化には、角かっこ内の文字をエスケープしないことが含まれます。これは不要だからです。私は\+最初の文字セットに言及していますが、ありがとうございます。イサクこれもまた見つけた!

私が理解できないもう1つの点は、なぜこれらすべての括弧を使用するのですか()

使用法を修正し、いくつかのマイナーな改善を提案することに加えて、ここ-の基本的なトピックは正規表現を使用して電子メールアドレスを検証する機会について広く議論されています。電子メールアドレスを正確に一致させるのは難しい作業であり、最初に想像したよりもはるかに複雑な表現が必要です。このフォーラムに似たフォーラムで見られる一般的な慣行は、データセットで機能すると予想される最も単純な正規表現を使用することです。

答え3

ハイフン-は文字クラス(角かっこ表現) は文字範囲を指定します。文字クラスにリテラルを追加するには、文字クラスをエスケープするか、文字クラスの末尾または先頭(ある場合は後ろ)-に移動する必要があります。^

[a-z-]
[-a-z]
[a-z\-A-Z]

7.[...]

^<ハイフン - マイナス>文字は、リスト内の最初の文字(存在する場合は最初の文字の後)、または最後に表示される場合はそれ自体で処理されるか、または範囲式で終了範囲ポイントとして処理されます。たとえば、[-ac]式は [ac-]'a'、 'c'、または '-'文字と同じで、 'a'、 'c'、または '-'を除くすべての文字と一致します[^-ac][^ac-]

角かっこ式が「-」と「]」の両方を指定する場合は、角かっこ式で「]」を最初に配置し(存在する場合は「^」の後に)、「-」を最後に配置する必要があります。

答え4

どのバージョンを使用していますかawk

GNUを使用すると、このコマンドはawk出力を生成しませんが、エラーは発生しません。

これを使用すると、solaris awk次のエラーが発生します。

awk: syntax error near line 1
awk: bailing out near line 1

注意深くお読みくださいregex。メールアドレスと一致しません...

関連情報