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