我的音乐库中有一张合辑专辑,其歌曲标题的形式为,由于斜杠,ARTIST/ TITLE
这使得很难cp
或这些文件。mv
因此,我想将这些文件重命名为 以Title (Artist)
使它们更易于管理(并且也使它们的命名方式与我的音乐库的其余部分一致)。这是我到目前为止所拥有的:
#! /bin/bash
for i in ./*.flac; do
TITLE=`ls "$i" | sed #display string after backslash`
ARTIST=`ls "$i" | sed #display string before backslash`
mv ./"$i" ./"$TITLE ($ARTIST)"
done
还要记住,斜杠后面有一个空格,ARTIST/ TITLE
也可能会弄乱事情。
答案1
我认为你的问题是:
我有一个包含字符串的 bash 变量;我想将它分成两部分,在字符串之前和之后"/ "
。
如果是这样,这里有一个简单的 bash 解决方案:
track="Judy Garland/ Somewhere Over the Rainbow"
title="${track#*/ }"
artist="${track%%/ *}"
语法#
的意思是“没有匹配...的最短前缀”。语法%%
的意思是“没有匹配...的最长后缀”。 (类似地,##
应该是最长的前缀和%
最短的后缀。)该模式是普通的 bash glob(如果shopt -s extglob
有效,则为扩展的 bash glob)。这是不是一个正则表达式。
如果模式不匹配,则字符串将不加修改地返回,您可能应该检查该条件,特别是如果您不确定斜杠后面是否有空格。
顺便问一下,你为什么使用ls "$i"
?当然,这与 的值没有什么不同$i
;你也可以使用echo
or 一个“here-string”:
sed '# some sed magic' <<<"$i"