string - 在 bash 中返回破折号之前的子字符串,后跟数字

标签 string bash shell pattern-matching substring

我有一个字符串,可以是以下之一:

1.) AA_BB-CC_xxxx-xx.y.y-xxxxxxxx-yyyyyy.tar.gz

或者删除前缀:

2.) CC_xxxx-xx.y.y-xxxxxxxx-yyyyyy.tar.gz

其中 A、B、C、D 是任意数量的字母,x 和 y 是数字。我需要从上面提取以下内容:

AA_BB-CC_xxxx
CC_xxxx

示例:

standalone_version-WIN_2012-16.3.2-20180627-131137.tar.gz
WIN_2008-16.3.2-20180614-094525.tar.gz

需要提取:

standalone_version-WIN_2012
WIN-2008

我试图丢弃从末尾到遇到第一个破折号后跟数字的所有内容。我正在使用以下内容,但它返回整个字符串:

name=${image_file%%-[0-9].*}

最佳答案

你就快到了!而不是

name=${image_file%%-[0-9].*}

省略点:

name=${image_file%%-[0-9]*}

bash %% 字符串修剪中的表达式为 patterns ,不是正则表达式。因此,* 单独匹配任意数量的字符,而不是像正则表达式中那样匹配 .*

示例(在 bash 4.4.12(3)-release 中测试):

$ foo='standalone_version-WIN_2012-16.3.2-20180627-131137.tar.gz'
$ bar='WIN_2008-16.3.2-20180614-094525.tar.gz'
$ echo ${foo%%-[0-9].*}
standalone_version-WIN_2012-16.3.2-20180627-131137.tar.gz
    # oops
$ echo ${foo%%-[0-9]*}
standalone_version-WIN_2012
    # no dot - works fine
$ echo ${bar%%-[0-9]*}
WIN_2008
    # same here.

关于string - 在 bash 中返回破折号之前的子字符串,后跟数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51548357/

相关文章:

bash - 我怎样才能得到父脚本的名字?

shell - 在哪里可以了解 "shell:"URI?

c - 简单linux shell中的环境变量

java - 简单的 JAVA : Password Verifier problem

python - 两个单词列表的概率分布

bash - 如何从脚本向脚本发送信号 SIGINT?

linux - 如何在perl中创建依赖进程

SQL:查找行之间最长的公共(public)字符串

java - 如何让实例在 Java 中直接返回字段的字符串,就像在 Python 中使用 __radd__ 所做的那样?

linux - bash:用于踢除 localhost 之外的所有 ssh 条目的脚本