我有一个填充了文件名和路径的bash变量:
SONG="~/Music/Mine/Cool Title Bro.flac"
在我尝试使标记变得更加容易的过程中,我对变量应用了一些转换以隔离标题:
echo "${SONG#\~/Music/Mine/}" # which prints: Cool Title Bro.flac
我知道也可以用${SONG %%.flac}删除后缀.
但是,是否可以在单个操作中删除前缀和后缀?
这个:
${SONG#\~/Music/Mine/%%.flac}
大概是因为它试图匹配文字%%.flac作为前缀的一部分.反过来不起作用(%%.flac#〜/ […]),我甚至疯了似试
${${SONG#~/Music/Mine/}%%.flac}
这也行不通.
这可能是我工程过度工程的一个主要例子,但是如果有办法做到这一点并且我还没有弄清楚它会很好.
echo "1:" if [[ "$SONG" =~ \~/Music/Mine/(.*)\.flac ]] ; then SONG=${BASH_REMATCH[1]} ; fi echo $SONG echo "2:" [[ "$SONG" =~ \~/Music/Mine/(.*)\.flac ]] && SONG=${BASH_REMATCH[1]} echo $SONG
1和2使用bash正则表达式.如果您的字符串与预期的格式不匹配,第一个示例还具有能够进入else分支的附加优势.*第二个示例有点清晰.在这两种情况下,如果${SONG}与模式不匹配,则保持不变.
但是使用awk或sed可能更容易理解.例如:
echo "3:" SONG=$(echo "$SONG" | sed -r 's:~/Music/Mine/(.*)\.flac:\1:') echo $SONG
[*]参见DennisWilliamson关于使用||的注释得到一个其他分支.