2014-07-18 2 views
1

정규 표현식을 사용하여 많은 파일 이름과 비슷한 이름을 찾습니다. 아래 파일을 참조하십시오.문자열의 일부를 bash에서 정규 표현식과 일치시키는 방법은 무엇입니까?

file1="CGInoimport" 
file2="doCGIimport" 
file3="donoCGInoimport" 
file4="importCGIno" 

나는 정규 표현식이 일치하는지 확인하기 위해 각 파일 변수를 통해 반복하는 for 루프를 사용하고 있습니다. 단어 CGI을 포함하는 파일 이름을 분리하려고합니다. 여기까지 내가 지금까지 가지고있는 것이있다.

for ((i=1; i < 5; i++)) ; do 
    if [[ file$i =~ ^CGI$ ]] ; then 
     echo "There is a CGI in the name" 
    else 
     echo "This shouldn't happen" 
    fi 
done 

문제는 내가 This shouldn't happen를 얻고, 각 file입니다. 정규 표현식에 문제가 있다는 것을 알고 있지만 어떻게 수정해야할지 모르겠다. 어떤 제안?

추가 설명이 필요한 경우 알려 주시기 바랍니다.

답변

5

문자열이 CGI 인 경우에만 정규식 ^CGI$이 일치합니다. 부분 문자열을 일치 시키려면 간단히 CGI을 사용하십시오.

정규 표현식에서 ^은 문자열 시작 부분 ("앵커")과 끝에 만 일치하고 끝에 만 $이 있기 때문입니다. 즉, 여기서 쉘 스타일의 패턴 (=~이 아닌 = 연산자)을 사용하는 것이 일반적이며 암시 적 앵커 기능을 사용하지 않으려면 단순히 와일드 카드를 사용하는 것이 더 일반적입니다.

마지막으로 변수 조회를 통해 조회하고 싶기 때문에 가변 간접 참조를 사용해야합니다. 그래서 :

말했다
varname=file$i 
if [[ ${!varname} = *CGI* ]]; then 
    echo "There is a CGI in the name" 
fi 

,이 배열을 사용하는 것입니다 할 수있는 더 나은 방법. 그래서 :

files=(CGInoimport doCGIimport donoCGInoimport importCGIno) 
for file in "${files[@]}"; do 
    [[ $file = *CGI* ]] && echo "There is CGI in the name $file" 
done 

... 또는, 키가 연관 배열, 숫자가 아닌 또는 불연속 될 수있는 경우 :

declare -A files=(
    [file1]=CGInoimport 
    [file2]=doCGIimport 
    [file3]=donocCGInoimport 
    [file4]=importCGIno 
) 
for key in "${!files[@]}"; do 
    [[ ${files[file$key]} = *CGI* ]] && echo "There is CGI in $key" 
done 
+0

감사합니다 많이! +1 – Alias

+0

@Alias, ... 배열의 사용법, 연관성 또는 기타 사항을 설명하는 추가 사항을 확인하십시오. 일반적으로 배열은 간접 지정을 사용하는 모든 경우를 대신하는 더 나은 대체 방법입니다. –

+0

왜 간접 참조를 위해 연관 배열을 사용하는 것이 더 나은지 알고 있습니까? – Alias

관련 문제