在bash中拆分变量

时间:2015-06-13 02:25:49

标签: bash ffmpeg mp3

我有一堆我已经下载的歌曲,我试图转换为 .mp3 并重命名。将 .m4a 文件转换为带有ffmpeg mp3 后,它们都采用艺术家名称 - 歌曲名称.mp3的格式。我希望能够将歌曲名称和艺术家名称分成他们自己的变量,这样我就可以重命名文件并用歌曲名称和艺术家名称标记歌曲。

那么,我如何将变量分成两个变量,每个变量分别包含艺术家姓名和歌曲名称,其中两个信息在bash中用' - '分隔?

3 个答案:

答案 0 :(得分:2)

可以用纯粹的bash来完成:

#!/bin/bash
name="Artist Name - Song Name.mp3"
songname="${name#*- }"
songnamewithoutextentions="${songname%.*}"
artistname="${name% -*}"
printf "%s\n%s\n%s\n" "$artistname" "$songname" "$songnamewithoutextentions"

输出:

Artist: Artist Name
Song: Song Name.mp3
Song name without extention: Song Name

说明:

"${name#*- }"-$name第一次匹配后的字符串

"${name% -*}"-$name的最后一场比赛(右起第一场比赛)之前的字符串

您可以从manual了解有关Bash参数扩展的更多信息。

答案 1 :(得分:2)

使用内置于bash的正则表达式匹配:

regex='(.*) - (.*).mp3'
[[ $v =~ $regex ]]
artist=${BASH_REMATCH[1]}
song=${BASH_REMATCH[2]}

答案 2 :(得分:1)

使用shell

v='Artist Name - Song Name.mp3'
v=${v%.mp3}
song=${v#* - }
artist=${v% - $song}
echo a=$artist, s=$song

这会产生输出:

a=Artist Name, s=Song Name

请注意,此方法(如下面的sed解决方案)始终将艺术家和歌曲分配到-第一次次。因此,如果名称是:

v='Artist Name - Song Name - 2nd Take.mp3'

然后,输出是:

a=Artist Name, s=Song Name - 2nd Take

此方法为POSIX,可在dashbusybox以及bash下使用。

使用sed

$ v='Artist Name - Song Name.mp3'
$ { read -r artist; read -r song; } < <(sed 's/.mp3$//; s/ - /\n/' <<<"$v")
$ echo a=$artist s=$song
a=Artist Name s=Song Name

这假定(1)第一次出现-将艺术家姓名与歌曲名称分开,(2)文件名$v只有行(没有换行符)。< / p>

我们可以通过使用NUL作为分隔符而不是换行符来克服第二个限制:

$ { read -r -d $'\0' artist; read -r -d $'\0' song; } < <(sed 's/.mp3$//; s/ - /\x00/' <<<"$v"); echo a=$artist s=$song
a=Artist Name s=Song Name

以下是艺术家和歌曲名称中包含换行符的示例:

$ v=$'Artist\nName - Song\nName.mp3'
$ { read -r -d $'\0' artist; read -r -d $'\0' song; } < <(sed 's/.mp3$//; s/ - /\x00/' <<<"$v"); echo "a=$artist"; echo "s=$song"
a=Artist
Name
s=Song
Name

如何运作

sed命令删除.mp3后缀,然后用换行符替换-

sed 's/.mp3$//; s/ - /\n/' <<<"$v"

sed命令的输出由两行组成。第一行有艺术家姓名,第二行有歌曲名称。然后由两个read命令读取它们。