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

时间:2017-10-28 20:23:33

标签: bash shell pattern-matching parameter-expansion

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

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