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

Ich versuche, diese Regex ersetzen in einem einzigen Befehl zu vereinigen, so etwas wie:Bash Musterabgleich ‚oder‘ mit Hilfe von Shell Parameter Expansion

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

Doch diese letzte Option funktioniert nicht. Ich habe auch versucht mit \|, aber es scheint nicht zu funktionieren und ich habe nichts nützliches in bash Handbücher und Dokumentation gefunden. Ich brauche ${} anstelle von sed, auch wenn es mein Problem löst.

+2

Es ist wichtig zu beachten, dass dies * NOT * reguläre Ausdrücke sind, aber Glob-Muster. –

+0

Sie haben recht, sie sind ziemlich ähnlich, also bin ich verwirrt, danke. – aegroto

Antwort

1

Wenn Sie extended globbing (extglob über shopt) aktivieren, können Sie den *(pattern1|pattern2|...) Operator null oder mehr glob Muster passen:

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

Das funktioniert perfekt, danke! – aegroto

+0

Gern geschehen! Froh, dass ich Helfen kann. – randomir

1

Der Wechsel für Shell-Muster (extended Globbing unter der Annahme, shopt -s extglob aktiviert), ist @(pattern|pattern...). Für Ihren Fall:

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

Die Hinter / ist optional, wenn Sie nur ein Muster entfernen anstatt sie zu ersetzen.

Beachten Sie, dass wegen des doppelten Schrägstrichs, //, alle Vorkommen der Muster einzeln entfernt werden. Wenn Sie *(...) (siehe Randomirs Antwort) verwenden, werden aufeinanderfolgende Muster auf einmal entfernt. Wenn Sie keine riesige Zeichenfolge haben, sollte der Unterschied vernachlässigbar sein. (Wenn Sie riesige Strings haben, möchten Sie sowieso kein Globbing verwenden, da es nicht für diese Art von Ding optimiert ist.)

+0

Danke für diese Erklärung, es macht Globbing viel klarer. – aegroto

Verwandte Themen