我知道,bash通过正则表达式支持扩展的glob,比如对@(foo|bar)、*(foo)和?(foo)的支持。这种语法非常独特,即不同于ERE的语法--扩展的globs使用前缀表示法(操作符出现在before其操作数中),而不是像ERE那样的后缀。
我想知道它是否支持{n,m}类型的区间表达式功能,即如果大括号中有一个数字,则前面的正则表达式重复n次,或者如果有两个用逗号分隔的数字,则前面的正则表达式重复n到m次。我找不到一个特定的文档来说明在扩展的glob中启用了这种支持。
实际问题
今天我在其中一个问题中遇到了一个要求,即只删除字符串中的一对尾随零。尝试使用bash中扩展的glob支持来解决此问题
给定一些示例字符串,例如
foobar0000
foobar00
foobar000应该产生
foobar00
foobar
foobar0我试着使用带参数扩展的扩展glob来做
x='foobar000'分别使用。我尝试使用下面的区间表达式,很明显,它不会起作用
echo ${x%%+([0]{2})}例如,在ERE中将sed用作sed -E 's/[0]{2}$//',在BRE中用作sed 's/[0]\{2\}$//'
所以我的问题是,有没有可能使用任何扩展的全局运算符?我正在寻找在bash中使用扩展的glob支持的具体答案,如果不可能的话,我也会说“不”。
发布于 2018-06-04 03:26:00
=或!=运算符时,在filename expansion和[[...]] conditional constructs中使用模式匹配。你可以在pattern matching中看到的参数expansion.[set]{count}这样的表达式。例如,我们可以使用+(..)匹配一个或多个匹配项,等等,但是指定一个模式的匹配项的数量并不是possible.^和$ ),但我们可以使用${parameter%%word}参数扩展来删除参数的尾部部分。所以这将会起作用:
var='foobar000'
echo ${var%%[0][0]}而且,通过一些简单的黑客操作,我们可以这样做:
var='foobar000'
echo ${var%%$(yes '[0]' | head -n 2 | tr -d '\n')}这将从字符串中删除两个尾随的零。
https://stackoverflow.com/questions/50630607
复制相似问题