Regex 如何将正则表达式转换为在Bash脚本中工作?

Regex 如何将正则表达式转换为在Bash脚本中工作?,regex,bash,Regex,Bash,我有一个Bash脚本,我试图用它提取正则表达式的匹配项并打印它 我从Bash文档中发现,可以使用变量Bash_REMATCH来获取匹配的字符串并对其进行处理,但我还没有成功地将标准正则表达式转换为与Bash兼容的正则表达式 正则表达式是\d+(?=%)。从中提取匹配部分的字符串是 电池0:放电,XX%,YY:YY:YY剩余 我只想提取XX,即从1到100的百分比。我的正则表达式在Bash外部成功地实现了这一点,但在Bash内部它与任何内容都不匹配 以下是简化的脚本: #!/bin/bash a

我有一个Bash脚本,我试图用它提取正则表达式的匹配项并打印它

我从Bash文档中发现,可以使用变量Bash_REMATCH来获取匹配的字符串并对其进行处理,但我还没有成功地将标准正则表达式转换为与Bash兼容的正则表达式

正则表达式是
\d+(?=%)
。从中提取匹配部分的字符串是

电池0:放电,XX%,YY:YY:YY剩余

我只想提取XX,即从1到100的百分比。我的正则表达式在Bash外部成功地实现了这一点,但在Bash内部它与任何内容都不匹配

以下是简化的脚本:

#!/bin/bash

acpi_out="$(/usr/bin/acpi)"
acpi_exp="\d+(?=%)"

if [[ $acpi_out =~ $acpi_exp ]]; then
  echo $BASH_REMATCH[1]
else
  echo "Failed to match."
fi
输出总是
不匹配。
当预期为
XX
时。
我已经检查了
$acpi\u out
确实是正确的字符串,但我不明白为什么在其中找不到匹配项。

Bash不理解
\d
,它需要
[0-9]
[[:digit:]
。而且它不支持lookaheads

如果您不仅限于bash,还可以使用其他工具,我的建议是使用grep从您的输入中提取数字

acpi_out="$(/usr/bin/acpi)"
percent=$(egrep -o '[0-9]+%' | egrep -o '^[0-9]+')

if [ -n "$percent" ]; then
  echo $percent
else
  echo "Failed to match."
fi

现在,您的脚本甚至可以在
sh
中运行,不再需要
bash
:)

您是否仅限于bash,还是可以使用外部工具,如
grep
?实际上没有“标准正则表达式”之类的东西——或者说,有,但可能有数百种不同的“标准”s表示正则表达式语法,两者略有不同。