2014-07-07 2 views
3

쉘 스크립트를 작성하려고하는데 문자열에 -32이 있는지 확인해야합니다. 불행히도 대시를 실행하는 컴퓨터에서 실행해야하므로 bashisms를 사용하지 않고이 작업을 수행해야합니다.Bashisms없이 쉘에서 하위 문자열 확인

case ${1+"[email protected]"} in *-32*);;을 시도했지만 -321과 같이 나타납니다. 그 플래그를 찾기 위해 정규 표현식이나 무언가를 사용하는 방법이 있습니까? 문자열에 공백으로 구분 된 다른 플래그를 둘 수 있습니다.

나는 공백 또는 라인 끝과 함께 -32를 찾을 필요가있는 정규식이라고 생각한다. -32(\s|$)

정규 표현식에 상당히 익숙해 져서 정규 표현식을 사용하는 것이 가장 좋은 방법인지 잘 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다!

감사합니다.

+1

으로 호출 할 수있는 당신을 위해 약간의 기능을 쓸 것이다 왜 인수 끝나지 않았다 당신 루프 대신 하나의 문자열로 치료합니까? – Barmar

+0

이것이 바보 같은 질문 인 경우 죄송합니다. 어떻게해야합니까? – Mason

+1

'for arg; if "[X $ arg"= "X-32"] ...; done' – Barmar

답변

3

당신은 단어 경계와 grep를 사용할 수 있습니다

grep -E '-32\b' FILE 

\b 일치는 '단어 경계'에서이 영숫자 문자와 영숫자가 아닌 문자 사이의 위치를 ​​=.

기본 로케일에서 '영숫자'(위에 사용 된 용어)는 문자 클래스 [a-zA-Z0-9_] (즉, 숫자, 문자 A-Z 및 밑줄) 중 어떤 것과도 일치하는 문자를 의미합니다. 유사한 방식

하지가 목적지 \B 일치하는 단어 경계 (즉 그것의 어느 측의 캐릭터가 동일한 타입 인 모든 위치이든 모두 영숫자 또는 모두 비 - 영숫자).

grep -E '\B-32\b' FILE 

이 일치합니다 :

그래서 당신이 마이너스 기호 는 영숫자가 아닌 문자 (예 : 스페이스)로을 선행해야합니다 있는지 확인하기를 원한다면,뿐만 아니라, 당신은 다음을 작성합니다 xx -32 xx (빼기 전의 공백이 있음)이지만 xx-32 xx (공백없이)입니다. 공백 문자와 마이너스 문자가 모두 영숫자가 아니기 때문에 \B은 일치하지만 \b은 일치하지 않습니다.

grep -E '\b-32\b' FILE 

는 예를 들어, 일치하는 : 당신이 마이너스 기호가 대신 영숫자 문자로 시작되어 있는지 확인하고 싶었

, 당신은 다음 쓴다 x-32 x (공백없이)이지만 x -32 x (공백 앞에 마이너스가 있음)이 아닙니다.

1

이 모든 예제는 에만 내장 함수를 사용하며 dash과 완전히 호환됩니다. 당신은 실제로 당신이 case 또는 if 사용할 수있는 문자열의 하위 문자열을 찾고 있다면

찾기 하위 문자열

.

각기 다른 두 개의 match 함수를 작성하여 설명하겠습니다. 게으른 경우이 함수 중 하나를 스크립트에 잘라내어 붙여 넣을 수 있습니다.

if match -32 "$STRING"; then 
    echo "found '-32'!" 
fi 

예 : 내가 $STR 그래서 돈의 주위에 공간을 추가 위의 함수에서

function match() { 
    local SUBSTR="$1" STR="$2"    # get args 
    case " $STR " in       # add extra spaces 
     *" $SUBSTR "*) return 0 ;;   # return true if match 
    esac 
    return 1         # no match: return false 
} 

(: 당신은 시작과 끝 모두에 $SUBSTR 검색 원했고, 공백으로 문자열의 나머지 부분에서 분리 된 경우는 다음과 같이 사용할 수 있습니다 'T는 명시 적으로 시작과 문자열의 끝에서 일치를 찾을 수 있습니다.)

function match() { 
    local SUBSTR=" $1 " STR=" $2 "   # get args + add extra spaces 
    [ "${STR#*"$SUBSTR"}" != "$STR" ] \ 
     && return 0       # match: return true 
    return 1         # no match: return false 
} 

if 문은 조금 까다 롭습니다. ${STR#*"$SUBSTR"} 부분 표기는 $STR으로 시작하여 처음부터 모두 $SUBSTR의 첫 번째 항목까지 제거합니다 ($SUBSTR을 찾을 수 없으면 아무것도 제거하지 마십시오). 그런 다음 원본을 $STR과 비교하고 이 아닌 경우과 같은 부분 문자열을 찾았습니다.

, 이제 인수

찾기 당신이 실제로 인수를 찾고 있다면, 위의 기능을 사용하고 단순히 match "-32" "$*"를 사용하지만, 모든 문자열을 찾을 것이며,에서 인수를 구별 할 수 (예를 들어 파일 이름과 같은 인수가 일 때 문자열과 일치하는 '-32'가있는 경우).

이 경우 args를 살펴 보는 것이 좋습니다. 다시 나는 당신이 argmatch "$ARG" "[email protected]"

argmatch() { 
    local FIND="$1" ARG; shift    # get $FIND arg, remove it from [email protected] 
    for ARG; do        # loop [email protected] 
     [ "$ARG" = "$FIND" ] && return 0  # found? then return true 
    done 
    return 1         # return false 
}