0
hashrate=${line//*:/}
hashrate=${hashrate//H\/s/}

我正在尝试将此正则表达式替换统一为一个命令,例如:

hashrate=${line//*:\+/H\/s/}

但是,最后一个选项不起作用。我也尝试过\|,但它似乎不起作用,而且我在 bash 手册和文档中没有发现任何有用的东西。我需要使用${}而不是 sed,即使使用它可以解决我的问题。

4

2 回答 2

1

如果启用扩展通配符( extglobvia shopt),则可以使用*(pattern1|pattern2|...)运算符匹配零个或多个glob模式:

hashrate="${line//*(*:|H\/s)/}"
于 2017-10-28T20:39:01.640 回答
1

shell 模式的交替(假设shopt -s extglob启用扩展通配符)是@(pattern|pattern...). 对于您的情况:

${line//@(*:|H\/s)}

/如果您只是删除模式而不是替换它,则尾随是可选的。

请注意,由于双斜杠 ,//将删除所有出现的模式,一次一个。如果您使用*(...)(请参阅 randomir 的答案),连续模式将一次性全部删除。除非你有巨大的字符串,否则差异应该可以忽略不计。(如果你有巨大的字符串,你无论如何都不想使用 globbing,因为它没有针对这种事情进行优化。)

于 2017-10-28T20:39:10.377 回答