猛砸模式匹配“或”使用shell参数扩展
问题描述:
hashrate=${line//*:/}
hashrate=${hashrate//H\/s/}
我试图统一这个表达式替换成一个单一的指令,这样的:猛砸模式匹配“或”使用shell参数扩展
hashrate=${line//*:\+/H\/s/}
然而,这最后一个选项是行不通的。我也试过\|
,但它似乎没有工作,我还没有发现任何有用的bash手册和文档。我需要使用${}
而不是sed,即使使用它也能解决我的问题。
答
如果启用(通过shopt
extglob
)extended globbing,可以使用*(pattern1|pattern2|...)
运算符来匹配零种或多个水珠型态:
hashrate="${line//*(*:|H\/s)/}"
答
对于外壳的图案(假设扩展通配的交替,shopt -s extglob
启用),是@(pattern|pattern...)
。对于您的情况:
${line//@(*:|H\/s)}
尾随/
是可选的,如果你只是删除的模式,而不是替换它。
请注意,由于双斜线,//
,所有出现的模式将被删除,一次一个。如果您使用*(...)
(请参阅randomir的答案),连续模式将一次性全部删除。除非你有巨大的字符串,否则差异应该可以忽略不计。 (如果你有巨大的字符串,不管怎么样都不想使用通配符,因为它没有针对这种事情进行优化。)
+0
感谢您的解释,它使globbing更清晰。 – aegroto
重要的是要注意这些是* NOT *正则表达式,但是glob模式。 –
你是对的,他们非常相似,所以我感到困惑,谢谢。 – aegroto