使用 bash 提取子字符串

使用 bash 提取子字符串

全部,

我的文件名始终采用以下格式“rX_Q_Y_filename.mp3”,其中 X 和 Y 是数字 (0-9)。仅供参考,文件名中的 X 和 Y 可以是 1 位或多位数字

例如“r1234_Q_456789_filename.mp3”

如何使用 bash 脚本提取文件名中的“Q_456789”部分?

答案1

对于 bash:

# See "modern regexps" in regex(7) for regexp syntax.

# The intermediate $re variable is not necessary, but it removes the
# need for having to escape every single metacharacter in the regexp.

re='_(Q_[[:digit:]]+)'

if [[ $name =~ $re ]]; then
    part=${BASH_REMATCH[1]}
    echo "Matched on $part"
else
    echo "Match failed"
fi

答案2

我不确定这是否正是你想要的,但是:

ls -1 r*.mp3 | egrep -o Q_[0-9]+

将返回 Q_{numbers} 列表

$ ls r*.mp3
r1234_Q_456789_test.mp3

$ ls -1 r*.mp3 | egrep -o Q_[0-9]+
Q_456789

答案3

这是一种低效的使用方法awk

$ ls -1 *.mp3
r1234_Q_433_filename.mp3
r1234_Q_456789_filename.mp3
r323_Q_433_filename.mp3

$ ls -1 *.mp3 | awk '{print substr($1, match($0, /Q/), (match($0, /\_f/) - match($0, /Q/)))}'
Q_433
Q_456789
Q_433

答案4

Sed 一行代码:

sed 's/[^Q]*\(Q_[0-9]*\)_.*/\1/' <<<"r1234_Q_456789_filename.mp3"
Q_456789

“Q” 是您感兴趣的第一个字符,因此丢弃它之前的所有内容,将“Q_number”分组,然后丢弃其余部分,替换反向引用。

相关内容