gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:57:27 24 4
gpt4 key购买 nike

我有一个填充有文件名和路径的 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 关于使用 || 获取 else 分支的注释。

关于bash - 是否可以在一次操作中应用两个匹配模式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11115347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com