>

bash에서 if 문 내부의 문자열을 다시 일치 시키려고합니다. 아래 코드 :

var='big'
If [[ $var =~ ^b\S+[a-z]$ ]]; then 
echo $var
else 
echo 'none'
fi

Match는 'b'로 시작하고 하나 이상의 공백 문자가 아닌 문자 a-z로 끝나는 문자열이어야합니다. 문자열의 시작과 끝을 일치시킬 수 있지만 \ S가 공백이 아닌 문자와 일치하도록 작동하지 않습니다. 도움을 주셔서 감사합니다.

  • 답변 # 1

    비 GNU 시스템에서 왜 \S 를 설명 하는가?  실패 :

    와이즈 비즈  PCRE (Perl 호환 정규식)의 일부입니다. 쉘에서 사용되는 BRE (기본 정규 표현식) 또는 ERE (확장 정규 표현식)의 일부가 아닙니다.

    bash 연산자 \S  내부 이중 브래킷 테스트 =~  ERE를 사용하십시오.

    ERE에서 특별한 의미를 가진 유일한 문자 (일반 문자와 반대)는 [[ 입니다. . .[\()*+?{|^$ 가 없습니다  특별하게. 보다 기본적인 요소로 정규식을 작성해야합니다.

    S
    
    

    괄호 표현이 regex='^b[^[:space:]]+[a-z]$' 인 곳    [^[:space:]] 와 같습니다  PCRE 표현식 :

    기본 \S  문자는 이제 HT (9), LF (10), VT (11), FF (12), CR (13) 및 공백 (32)입니다.

    테스트는 :

    \s
    
    
    그러나 위 코드는 var='big' regex='^b[^[:space:]]+[a-z]$' [[ $var =~ $regex ]] && echo "$var" || echo 'none' 와 일치합니다.  예를 들어. 범위 bißß 로   [a-z] 이외의 다른 문자를 포함합니다  선택한 로케일이 (UNICODE) 인 경우 이러한 문제를 피하려면 다음을 사용하십시오.

    abcdefghijklmnopqrstuvwxyz
    
    

    코드는 var='bißß' regex='^b[^[:space:]]+[a-z]$' ( LC_ALL=C; [[ $var =~ $regex ]]; echo "$var" || echo 'none' ) 목록의 문자 만 일치합니다.  마지막 문자 위치에 있지만 여전히 중간에 다른 많은 문자와 일치합니다. 와이즈 비즈 .

    <시간>

    아직도이 abcdefghijklmnopqrstuvwxyz 사용  다른 정규식 범위에 영향을 미칩니다 : bég  C 로케일의 공백 만 일치합니다.

    모든 문제를 해결하려면 각 정규식을 별도로 유지해야합니다.

    LC_ALL=C
    
    

    다음과 같이 읽습니다 :

    입력 (var)에 공백이없는 경우 (현재 로케일)

    [[:space:]] 로 시작하는지 확인  그리고 reg1=[[:space:]] reg2='^b.*[a-z]$' out=none if [[ $var =~ $reg1 ]] ; then out=none elif ( LC_ALL=C; [[ $var =~ $reg2 ]] ); then out="$var" fi printf '%6.8s\t|' "$out" 로 끝납니다  (C 로케일로).

    두 테스트는 양의 범위에서 수행됩니다 ( "not"범위가 아닌). 그 이유는 두 문자를 부정하면 훨씬 더 많은 일치 항목이 열립니다. UNICODE v8에는 120,737자가 이미 할당되어 있습니다. 범위가 17자를 무시하면 인쇄 할 수없는 많은 제어 문자를 포함 할 수있는 120720 개의 다른 문자를 사용할 수 있습니다.

    중간 문자가 가질 수있는 문자 범위를 제한하는 것이 좋습니다 (예, 공백이 아니라 다른 문자 일 수 있음).

  • 답변 # 2

    b
    
    

    와이즈 비즈  일치는 로케일에 따라 다르며 일반적으로 a-z 중 하나 인아님입니다. .

    [[ $var =~ ^b[^[:space:]]+[abcdefghijklmnopqrstuvwxyz]$ ]] [a-z]  (수평 및 수직 공간) 이제 다른 정규식 엔진으로도 인식됩니다 : abcdefghijklmnopqrstuvwxyz  POSIX와 bash의 ERE에서.

    perl  정규 표현식과 일치하기 위해 시스템의 정규 표현식 라이브러리를 사용하지만 정규 표현식에 \S 가있는 시스템 (최근 GNU와 같은 시스템)에서도  연산자로 인해 작동하지 않습니다 :

    [^[:space:]]
    
    

    bash   \S 에 전화  다음과 함께 :

    [[ x = \S ]]
    
    

    bash   regcomp("S") 에 전화  (두 개의 백 슬래시).

    그러나 bash-3.1 또는 [[ x = '\S' ]] 와 bash-3.1 호환성을 켜면 그런 다음 :

    bash
    
    
    ERE가 regcomp("\\S") 를 지원하는 시스템에서

    가 작동합니다 (간격이 아닌 문자와 일치 함). .

    shopt -s compat31
    
    

    다른 옵션은 regexp를 변수에 넣는 것입니다 :

    [[ x = '\S' ]]
    
    

    다시 말해, 펄 같은 \S 를 지원하는 시스템에서만 작동합니다  정규 표현식으로.

    $ bash -c "[[ x =~ '\S' ]]" || echo no no $ bash -O compat31 -c "[[ x =~ '\S' ]]" && echo yes yes 에 해당하는 POSIX 특정 코드 :

    $ a='\S' bash -c '[[ x =~ $a ]]' && echo yes
    yes
    
    

    또는 :

    \S
    
    
    bash

  • 이전 linux - Intel Ivy Bridge의 듀얼 모니터 구성
  • 다음 성능 기록 -a - 모든 샘플에서 코어 당 샘플이 표시되지 않는 이유는 무엇입니까?