猛砸模式匹配“或”使用shell参数扩展

猛砸模式匹配“或”使用shell参数扩展

问题描述:

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

我试图统一这个表达式替换成一个单一的指令,这样的:猛砸模式匹配“或”使用shell参数扩展

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

然而,这最后一个选项是行不通的。我也试过\|,但它似乎没有工作,我还没有发现任何有用的bash手册和文档。我需要使用${}而不是sed,即使使用它也能解决我的问题。

+2

重要的是要注意这些是* NOT *正则表达式,但是glob模式。 –

+0

你是对的,他们非常相似,所以我感到困惑,谢谢。 – aegroto

如果启用(通过shoptextglobextended globbing,可以使用*(pattern1|pattern2|...)运算符来匹配零种或多个水珠型态:

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

这很好,谢谢! – aegroto

+0

不客气!乐意效劳。 – randomir

对于外壳的图案(假设扩展通配的交替,shopt -s extglob启用),是@(pattern|pattern...)。对于您的情况:

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

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

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

+0

感谢您的解释,它使globbing更清晰。 – aegroto