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 上运行代码
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)
| 归档时间: |
|
| 查看次数: |
1062 次 |
| 最近记录: |