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. 대시( -)는 명시적인 대시가 아닌 "문자 범위"를 의미합니다.

    해당 오류 메시지는 -문자 범위( _및 ) .내에서 대시( )를 둘러싼 두 문자가 (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]

설명하다: 이 문자 의 위치 -는 간격을 나타낼 수 있으므로 모호합니다. 정규식의 시작 부분으로 이동하거나 이스케이프하면 정상적으로 작동합니다.

추가 정보: 정규식이 작동하는지 확인하세요.웹사이트확실하지 않을 때에는.


올바르게 지적했듯이이삭, 표현식의 마지막 점은 생각한 대로 작동하지 않습니다. .모든 문자를 나타내며 문자 그대로의 점을 나타내려면 이스케이프해야 합니다.\.

추가 최적화에는 대괄호 안의 문자를 이스케이프 처리하지 않는 것이 포함됩니다. 이는 불필요하기 때문입니다. 나는 \+첫 번째 문자 집합을 언급하고 있는데 감사해야 합니다.이삭이걸 또 찾았어!

내가 이해할 수 없는 또 다른 점은 왜 이 모든 괄호를 사용하는가입니다 ().

사용법을 수정하고 몇 가지 사소한 개선 사항을 제안하는 것 외에도 -여기서의 기본 주제는 정규식을 사용하여 이메일 주소의 유효성을 검사할 수 있는 기회에 대해 널리 논의되는 것입니다. 이메일 주소를 정확하게 일치시키는 것은 어려운 작업이며 처음 상상했던 것보다 훨씬 더 복잡한 표현이 필요합니다. 이 포럼과 유사한 포럼에서 볼 수 있는 일반적인 관행은 데이터 세트에 작동할 것으로 예상되는 가장 간단한 정규식을 사용하는 것입니다.

답변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. 이메일 주소와 일치하지 않습니다...

관련 정보