2017-10-28 131 views
0
hashrate=${line//*:/} 
hashrate=${hashrate//H\/s/} 

我試圖統一這個表達式替換成一個單一的指令,這樣的:猛砸模式匹配「或」使用shell參數擴展

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

然而,這最後一個選項是行不通的。我也試過\|,但它似乎沒有工作,我還沒有發現任何有用的bash手冊和文檔。我需要使用${}而不是sed,即使使用它也能解決我的問題。

+2

重要的是要注意這些是* NOT *正則表達式,但是glob模式。 –

+0

你是對的,他們非常相似,所以我感到困惑,謝謝。 – aegroto

回答

1

如果啓用(通過shoptextglobextended globbing,可以使用*(pattern1|pattern2|...)運算符來匹配零種或多個水珠型態:

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

這很好,謝謝! – aegroto

+0

不客氣!樂意效勞。 – randomir

1

對於外殼的圖案(假設擴展通配的交替,shopt -s extglob啓用),是@(pattern|pattern...)。對於您的情況:

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

尾隨/是可選的,如果你只是刪除的模式,而不是替換它。

請注意,由於雙斜線,//,所有出現的模式將被刪除,一次一個。如果您使用*(...)(請參閱randomir的答案),連續模式將一次性全部刪除。除非你有巨大的字符串,否則差異應該可以忽略不計。 (如果你有巨大的字符串,不管怎麼樣都不想使用通配符,因爲它沒有針對這種事情進行優化。)

+0

感謝您的解釋,它使globbing更清晰。 – aegroto