模式匹配

Joh*_*hnB 1 bash shell-script regular-expression patterns

我正在尝试按照 Bash Cookbook 来了解 Bash Scripting。我正在使用正则表达式进行示例 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
Run Code Online (Sandbox Code Playgroud)

我将此应用于我目录中的几个文件:

Ludwig van Beethovern - 02 - Adagio un poco mosso.ogg

路德维希·范·贝多芬 - 01 - Allegro.ogg

我总是得到一个错误返回。问题似乎与([[:alpha:][:blank:]]*)- ([[:digit:]]*) -代码部分有关。当我确实有 if 语句时:if [[ "$CDTRACK" =~ "(.*)$" ]]那么就没有错误。

关于我做错了什么的任何想法?

我在 AWS,Bash v 4.2 上运行代码

Jak*_*uje 6

ShellCheck是 bash 编程的良好开端。它提供了非常有用的提示:

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

正则表达式不能这样引用。使用转义特殊字符(基本上是空格)的工作示例:

if [[ "$CDTRACK" =~ ([[:alpha:][:blank:]]*)-\ ([[:digit:]]*)\ -\ (.*)$ ]]
Run Code Online (Sandbox Code Playgroud)

或者正如glenn jackman 所提议的,只引用其他字符(对于使用不同语言的人来说这看起来很奇怪,但也有效):

if [[ "$CDTRACK" =~ ([[:alpha:][:blank:]]*)"- "([[:digit:]]*)" - "(.*)$ ]]
Run Code Online (Sandbox Code Playgroud)

Oneliner 对现有字符串进行测试:

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