Bash 模式匹配 'or' 使用 shell 参数扩展

Bash pattern matching 'or' using shell parameter expansion

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

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

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

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

如果启用extended globbingextglob通过shopt),您可以使用*(pattern1|pattern2|...)运算符匹配零个或多个glob 模式:

hashrate="${line//*(*:|H\/s)/}"

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

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

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

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