bash – 是否可以在一个操作中应用两个匹配的模式转换?

前端之家收集整理的这篇文章主要介绍了bash – 是否可以在一个操作中应用两个匹配的模式转换?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个填充了文件名和路径的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关于使用||的注释得到一个其他分支.

猜你在找的Bash相关文章