我需要解决的任务是从目录中的每个文件名中提取特定的子字符串。
文件名示例:
鲍勃·马利 - 我射杀了警长 -2XiYUYcpsT4.mp3
Audioslave - 做你自己-WC5FdFLUcl0.mp3
Bruno Mars - Treasure [官方音乐视频]-nPvuNsRccVw.mp3
基本上,它是我从 youtube 获取的音乐集合,我需要提取视频 ID(粗体部分)。我怎样才能在bash中解决这个问题?基于定界符的分割并不可靠,因为视频 ID 有时包含连字符本身。
答案1
你可以使用子串扩展:
for file in ./*.mp3
do
videoid=${file:${#file}-15:11}
printf %s\\n $videoid
done
或者,如果有多个扩展名,请使用
noext=${file%.*}
videoid=${noext:${#noext}-11:11}
答案2
如果 id 之前始终有破折号,并且 id 后面没有破折号,则可以使用简单的参数扩展。从值的末尾和开头%
删除模式。#
将符号加倍会使其变得“贪婪” - 它会删除尽可能多的内容。
#! /bin/bash
files=( 'Bob Marley - I Shot The Sheriff-2XiYUYcpsT4.mp3'
'Audioslave - Be Yourself-WC5FdFlUcl0.mp3'
'Bruno Mars - Treasure [Official Music Video]-nPvuNsRccVw.mp3'
)
for file in "${files[@]}" ; do
id=${file##*-}
id=${id%.mp3}
echo "$id"
done