패턴 일치 [중복]

패턴 일치 [중복]

Bash Cookbook을 따라 Bash 스크립팅에 대해 배우려고 합니다. 정규식을 사용하여 테스트하기 위해 예제 6.8을 사용하고 있습니다.

다음 스크립트가 있습니다.

#!/usr/bin/env bash
# cookbook filename: trackmatch

for CDTRACK in *
do
     if [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]]
then
    echo ${BASH_REMATCH[2]}
else
    echo Error $CDTRACK
fi
done

디렉토리의 여러 파일에 적용합니다.

루트비히 판 베토벤 - 02 - Adagio un poco mosso.ogg

루트비히 판 베토벤 - 01 - Allegro.ogg

항상 오류가 반환됩니다. 문제는 ([[:alpha:][:blank:]]*)- ([[:digit:]]*) -코드 부분에 있는 것 같습니다. 내 if 문이 다음과 같으면 if [[ "$CDTRACK" =~ "(.*)$" ]]오류가 없습니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

AWS Bash v 4.2에서 코드를 실행하고 있습니다.

답변1

주택 검사Bash 프로그래밍을 위한 좋은 시작입니다. 매우 유용한 팁을 제공합니다.

Line 6:
if [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]]
                    ^-- SC2076: Don't quote rhs of =~, it'll match literally rather than as a regex.

정규식은 이런 식으로 인용할 수 없습니다. 이스케이프된 특수 문자(기본적으로 공백)를 사용한 작업 예:

if [[ "$CDTRACK" =~ ([[:alpha:][:blank:]]*)-\ ([[:digit:]]*)\ -\ (.*)$ ]]

또는글렌 잭맨제안된 내용은 다른 문자를 인용하는 것입니다(다른 언어를 사용하는 사람들에게는 이상하게 보일 수도 있지만 작동합니다).

if [[ "$CDTRACK" =~ ([[:alpha:][:blank:]]*)"- "([[:digit:]]*)" - "(.*)$ ]]

Oneliner는 기존 문자열을 테스트하는 데 사용됩니다.

if [[ "Ludwig van Beethovern - 02 - Adagio un poco mosso.ogg" =~ ([[:alpha:][:blank:]]*)-\ ([[:digit:]]*)\ -\ (.*)$ ]]; then echo "${BASH_REMATCH[2]}"; fi

관련 정보