Bash 参数扩展 - 匹配但不包括正则表达式
Bash Parameter Expansion - match up to but not including regex
我想匹配但不包括给定的 字符串 。所以在像
这样的文本中
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
注意第一个 数字 是如何被省略的。
要删除第一个匹配数字后的所有内容:
$ 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
我想匹配但不包括给定的 字符串 。所以在像
这样的文本中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
注意第一个 数字 是如何被省略的。
要删除第一个匹配数字后的所有内容:
$ 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