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})$/'

おすすめ記事