bash 스크립트의 정규식


12

이것은 처음으로 bash 스크립팅이므로 쉽게 실수 할 수 있습니다.

기본적으로 사용자 그룹을 가져 오는 스크립트를 작성하려고하는데 특정 그룹에 있으면 그에 따라 기록합니다. 분명히 더 많은 기능이있을 것이지만 정규식을 작동시킬 수 없을 때도 포인트가 없습니다!

지금까지 나는 이것을 가지고있다 :

#!/bin/bash

regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"

# example output
groups="username : username usergroup"

echo "$groups" >> /home/jrdn/log

if [[ "$groups" =~ $regex ]]; then
    echo "Match!" >> /home/jrdn/log
else
    echo "No match" >> /home/jrdn/log
fi

정규식을 시도한 모든 곳에서 작동합니다. 하지만 bash는 스크립트에서, 그것은 단지 이제까지 출력 $groups, 다음을 No match. 그래서 누군가가 무엇이 잘못되었는지 말해 줄 수 있습니까?


1
무엇이 잘못되었다고 생각합니까?
manatwork

1
@jrdnhannah는 대상 정규 표현식을 천천히 다시 만들고 먼저 일치 ^([a-zA-Z0-9\-_]+)하고 콜론을 추가하는 등의 작업을 시도합니다 ... 곧 문제가있는 곳을 찾아야합니다.
peterph

2
bash 4.2.45와 동일합니다. 밑줄을 피하면 문제가 해결되었습니다. 기묘한. @ jrdnhannah 당신은 그것을 답변으로 작성하고 받아 들일 수 있습니까?
terdon

1
방금 Unix SE에만 가입했기 때문에 8 시간을 기다려야합니다. 그러나 다른 사람이 대답하면 답변으로 표시하게되어 기쁩니다.
jrdn

4
@terdon bash는 아마도 libc의 정규식 함수를 호출합니다. 따라서 bash 버전이 아닌 libc 버전에 따라 다릅니다. 내 대답을 참조하십시오 ... (또는 사용중인 데이터 정렬 시퀀스에서도)
derobert

답변:


13

보낸 사람 man 7 regex:

대괄호 표현식은 "[]"로 묶인 문자 목록입니다. …

… 문자 '-'를 포함 시키려면 첫 문자 또는 마지막 문자로 만드십시오.… [A] '\'를 포함한 다른 특수 문자는 대괄호 표현식 내에서 특별한 의미를 잃습니다.

egrep으로 정규 표현식을 시도하면 오류가 발생합니다.

$ echo "username : username usergroup" | egrep "^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
egrep: Invalid range end

다음은 더 간단한 버전이며 오류가 발생합니다.

$ echo 'hi' | egrep '[\-_]'
egrep: Invalid range end

\특별한 것이 아니기 때문에 , 그것은 범위와 같습니다 [a-z]. 또는 다음 -과 같이 마지막 에 넣어야합니다 [_-].

echo "username : username usergroup" | egrep "^([a-zA-Z0-9_-]+ : [a-zA-Z0-9_-]+) (usergroup)$"
username : username usergroup

이것은 libc 버전과 상관없이 작동해야합니다 (egrep 또는 bash).

편집 : 이것은 실제로 로케일 설정에 달려 있습니다. 맨 페이지에서 이에 대해 경고합니다.

범위는 배열 순서에 따라 매우 다르며 이식 가능한 프로그램은 범위에 의존하지 않아야합니다.

예를 들면 다음과 같습니다.

$ echo '\_' | LC_ALL=en_US.UTF8 egrep '[\-_]'
egrep: Invalid range end
$ echo '\_' | LC_ALL=C egrep '[\-_]'
\_

물론 오류가 발생하지 않았지만 원하는 것을 수행하지 않습니다.

$ echo '\^_' | LC_ALL=C egrep '^[\-_]+$'
\^_

그것은 ASCII에 포함하는 범위의 \, [, ^,와 _.


흥미 롭군 내 egrep오류는 없으며 올바르게 일치합니다.
manatwork

@manatwork 당신의 조합 순서는 아마도 범위를 허용합니다 ....
derobert

데이터 정렬에 대해 잘 모릅니다. 당신은 이것을 의미합니다 : LC_COLLATE="en_US.UTF-8"?
manatwork

@manatwork 예제를 제공하기 위해 질문을 편집했습니다. 데이터 정렬 (정렬) 순서가 변경되기 때문에 시스템에 따라 다를 수 있습니다.
derobert

1
@manatwork 괜찮습니다. 탈출 시도를 알아 차리기 전에 버그 보고서를 거의 제출했습니다 -.
derobert

4

정규 표현식 (및 더 큰 코드 조각의 모든 버그)이있는 일반적인 규칙 : 단계별로 자르고 다시 작성하거나 이등분을 사용하십시오.

이 경우 범인은 밑줄로 밝혀졌습니다. 백 슬래시로 이스케이프 처리하면 효과가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.