bash 스크립트에서 =~를 사용하여 정규식 ^#.*${new_user}를 일치시키는 방법은 무엇입니까?

bash 스크립트에서 =~를 사용하여 정규식 ^#.*${new_user}를 일치시키는 방법은 무엇입니까?

제목에는 기본적으로 모든 내용이 나와 있지만 평생 알아낼 수 없으며 bash 정규식 일치로 인해 혼란스러워집니다. 이것은 if내 bash 스크립트에 있는 설명이지만 항상 해당 줄과 일치합니다 ${new_user}. # ${new_user}기본적으로 "주석 처리된" 사용자와 일치시키고 싶습니다.

if [[ $(<"foo.txt") =~ \#.*${new_user} ]]; then

답변1

이 패턴의 경우 정규 표현식을 사용하지 않고 glob 표현식만 사용하는 것이 훨씬 간단합니다. 이는 ^#.*${new_user}귀하의 질문 과 동일합니다 .

% new_user=foo
% [[ '# somethingfoo' == '#'*"${new_user}"* ]]; echo $?
0
% [[ '# somethingbar' == '#'*"${new_user}"* ]]; echo $?
1

질문의 한쪽에만 고정하고 있으므로 뒤에 오는 문자를 일치시키려는 것처럼 들립니다 $new_user. 정말로 끝부분에 고정하고 싶다면 제거하세요 *.

Bash에서 정규식을 사용하는 것은 확실히 가능하지만 인체공학과 총격전은 꽤 어색합니다. 가능하다면 글로브나 다른 메커니즘을 사용하는 것이 좋습니다.

정규식을 꼭 사용해야 하는 경우 사용 방법은 다음과 같습니다( ${new_user}정규식 문자를 포함하는 경우 인용하는 것이 유일한 차이점입니다).

$ [[ '# somethingfoo' =~ ^#.*"${new_user}" ]]; echo $?
0
$ [[ '# somethingbar' =~ ^#.*"${new_user}" ]]; echo $?
1

다시 말하지만, 끝에 앵커를 추가하려면 $.


^여러 줄의 맥락에서 의미를 오해할 수도 있습니다 . Bash에서는 ^줄의 시작이 아닌 문자열의 시작과 일치합니다. 무언가가 있는지 확인하기 위해 각 행을 살펴봐야 하는 경우 , if grep ...; then또는 다음 루프를 사용하세요.

found=0
while IFS= read -r line || [[ $line ]]; do
    if [[ "$line" == '#'*"${new_user}"* ]]; then
        found=1
        break
    fi
done < foo.txt

# do something with $found

끝에 개행 문자가 없는 파일에 관심이 없다면 확인을 생략할 수 있습니다 [[ $line ]].

관련 정보