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