首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将间隔表达式与bash扩展globbing一起使用

将间隔表达式与bash扩展globbing一起使用
EN

Stack Overflow用户
提问于 2018-06-01 02:27:36
回答 1查看 985关注 0票数 6

我知道,bash通过正则表达式支持扩展的glob,比如对@(foo|bar)*(foo)?(foo)的支持。这种语法非常独特,即不同于ERE的语法--扩展的globs使用前缀表示法(操作符出现在before其操作数中),而不是像ERE那样的后缀。

我想知道它是否支持{n,m}类型的区间表达式功能,即如果大括号中有一个数字,则前面的正则表达式重复n次,或者如果有两个用逗号分隔的数字,则前面的正则表达式重复nm次。我找不到一个特定的文档来说明在扩展的glob中启用了这种支持。

实际问题

今天我在其中一个问题中遇到了一个要求,即只删除字符串中的一对尾随零。尝试使用bash中扩展的glob支持来解决此问题

给定一些示例字符串,例如

代码语言:javascript
复制
foobar0000
foobar00
foobar000

应该产生

代码语言:javascript
复制
foobar00
foobar
foobar0

我试着使用带参数扩展的扩展glob来做

代码语言:javascript
复制
x='foobar000'

分别使用。我尝试使用下面的区间表达式,很明显,它不会起作用

代码语言:javascript
复制
echo ${x%%+([0]{2})}

例如,在ERE中将sed用作sed -E 's/[0]{2}$//',在BRE中用作sed 's/[0]\{2\}$//'

所以我的问题是,有没有可能使用任何扩展的全局运算符?我正在寻找在bash中使用扩展的glob支持的具体答案,如果不可能的话,我也会说“不”。

EN

回答 1

Stack Overflow用户

发布于 2018-06-04 03:26:00

  • No
  • "Extended模式匹配特性“是使用extglob启用的(因此我们称其为扩展glob)。扩展的模式匹配功能在称为pattern matching的操作中使用。当使用=!=运算符时,在filename expansion[[...]] conditional constructs中使用模式匹配。你可以在pattern matching中看到的参数expansion.
  • As中使用了文件名扩展,不管是不是扩展的glob,模式匹配都不支持像[set]{count}这样的表达式。例如,我们可以使用+(..)匹配一个或多个匹配项,等等,但是指定一个模式的匹配项的数量并不是possible.
  • But这是bash,而bash是强大的。我们可以简单地通过重复模式来指定该模式的出现次数。我们不能指定结束或开始(我的意思是像在正则表达式中使用^$ ),但我们可以使用${parameter%%word}参数扩展来删除参数的尾部部分。所以这将会起作用:

代码语言:javascript
复制
var='foobar000'
echo ${var%%[0][0]}

而且,通过一些简单的黑客操作,我们可以这样做:

代码语言:javascript
复制
var='foobar000'
echo ${var%%$(yes '[0]' | head -n 2 | tr -d '\n')}

这将从字符串中删除两个尾随的零。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50630607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档