加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:18:42 所属栏目:安全 来源:网络整理
导读:我有一个填充了文件名和路径的bash变量: SONG="~/Music/Mine/Cool Title Bro.flac" 在我尝试使标记变得更加容易的过程中,我对变量应用了一些转换以隔离标题: echo "${SONG#~/Music/Mine/}" # which prints: Cool Title Bro.flac 我知道也可以用${SONG %%.
我有一个填充了文件名和路径的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关于使用||的注释得到一个其他分支.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读