Bash 模式匹配 'or' 使用 shell 参数扩展
Bash pattern matching 'or' using shell parameter expansion
hashrate=${line//*:/}
hashrate=${hashrate//H\/s/}
我正在尝试将此正则表达式替换统一为一个命令,例如:
hashrate=${line//*:\+/H\/s/}
但是,最后一个选项不起作用。我也试过 \|
,但它似乎不起作用,而且我在 bash 手册和文档中没有找到任何有用的东西。我需要使用 ${}
而不是 sed,即使使用它可以解决我的问题。
如果启用extended globbing(extglob
通过shopt
),您可以使用*(pattern1|pattern2|...)
运算符匹配零个或多个glob 模式:
hashrate="${line//*(*:|H\/s)/}"
shell 模式的交替(假设扩展通配,shopt -s extglob
已启用)是 @(pattern|pattern...)
。对于您的情况:
${line//@(*:|H\/s)}
如果您只是删除模式而不是替换模式,则尾部 /
是可选的。
请注意,由于双斜杠 //
,所有出现的模式都将被删除,一次一个。如果您使用 *(...)
(请参阅 randomir 的回答),连续的模式将一次性全部删除。除非你有巨大的弦,否则差异应该可以忽略不计。 (如果你有巨大的字符串,你无论如何都不想使用 globbing,因为它没有针对这种事情进行优化。)
hashrate=${line//*:/}
hashrate=${hashrate//H\/s/}
我正在尝试将此正则表达式替换统一为一个命令,例如:
hashrate=${line//*:\+/H\/s/}
但是,最后一个选项不起作用。我也试过 \|
,但它似乎不起作用,而且我在 bash 手册和文档中没有找到任何有用的东西。我需要使用 ${}
而不是 sed,即使使用它可以解决我的问题。
如果启用extended globbing(extglob
通过shopt
),您可以使用*(pattern1|pattern2|...)
运算符匹配零个或多个glob 模式:
hashrate="${line//*(*:|H\/s)/}"
shell 模式的交替(假设扩展通配,shopt -s extglob
已启用)是 @(pattern|pattern...)
。对于您的情况:
${line//@(*:|H\/s)}
如果您只是删除模式而不是替换模式,则尾部 /
是可选的。
请注意,由于双斜杠 //
,所有出现的模式都将被删除,一次一个。如果您使用 *(...)
(请参阅 randomir 的回答),连续的模式将一次性全部删除。除非你有巨大的弦,否则差异应该可以忽略不计。 (如果你有巨大的字符串,你无论如何都不想使用 globbing,因为它没有针对这种事情进行优化。)