Bash参数扩展 - 匹配但不包括正则表达式

时间:2016-10-22 16:52:52

标签: regex bash variable-expansion

我希望匹配但不包括给定的字符串。所以在像

这样的文本中
seirots-llet-ew-yhw-20-30-seirotS lleT eW yhW - yrotS ruoY lleT

我希望将其缩减为

20-30-seirotS lleT eW yhW - yrotS ruoY lleT


所以我有一组反向字符串,我在bash变量中捕获并希望用正则表达式扩展变量以实现如下所示:

输入:

seirots-llet-ew-yhw-20-30-seirotS lleT eW yhW - yrotS ruoY lleT
spets-ruoy-ecarter-30-30-spetS ruoY ecarteR - yrotS ruoY lleT
cra-yrots-40-30-crA yrotS ruoY - yrotS ruoY lleT
skcabhsalf-etaerc-50-30-skcabhsalF gnitaerC - yrotS ruoY lleT
noitnetta-60-30-noitnettA gnipeeK dna gnitteG - yrotS ruoY lleT

输出:

20-30-seirotS lleT eW yhW - yrotS ruoY lleT
30-30-spetS ruoY ecarteR - yrotS ruoY lleT
40-30-crA yrotS ruoY - yrotS ruoY lleT
50-30-skcabhsalF gnitaerC - yrotS ruoY lleT
60-30-noitnettA gnipeeK dna gnitteG - yrotS ruoY lleT


我的bash代码如下:

value="${reversed##*[a-z]-[0-9]}"

但结果是我想要的东西:

0-30-seirotS lleT eW yhW - yrotS ruoY lleT
0-30-spetS ruoY ecarteR - yrotS ruoY lleT
0-30-crA yrotS ruoY - yrotS ruoY lleT
0-30-skcabhsalF gnitaerC - yrotS ruoY lleT
0-30-noitnettA gnipeeK dna gnitteG - yrotS ruoY lleT

注意如何省略第一个数字

1 个答案:

答案 0 :(得分:1)

首先匹配数字后删除所有内容:

$ s='seirots-llet-ew-yhw-20-30-seirotS lleT eW yhW - yrotS ruoY lleT'
$ echo "${s%%[0-9]*}"
seirots-llet-ew-yhw-

因此,在上述情况下,20-30-seirotS lleT eW yhW - yrotS ruoY lleT匹配被删除,结果字符串为seirots-llet-ew-yhw-。然后可以将结果用作从s变量

的开头删除的字符串
$ echo "${s#${s%%[0-9]*}}"
20-30-seirotS lleT eW yhW - yrotS ruoY lleT


如果extglob shell选项可用,请参阅pattern matching manual

$ echo "${s##+([!0-9])}"
20-30-seirotS lleT eW yhW - yrotS ruoY lleT

+([!0-9])表示一个或多个非数字字符

使用正则表达式匹配:

$ [[ $s =~ [0-9].* ]] && echo ${BASH_REMATCH[0]}
20-30-seirotS lleT eW yhW - yrotS ruoY lleT