如何从字符串中提取没有“%”符号的百分比数字?

How can I extract a percentage number without the "%" symbol from a string?

-InternalBattery-0 (id=7405667) 100%; charged; 0:00 remaining present: true

我想在上面的字符串上做 egrep -ow (regex),只得到 100%100,没有别的。我该怎么做?

您可以使用 pcregrep 检查字符串是否有一到三位数字以边界开头,并向前查找百分比字符:

pcregrep --color '\b(?:100|[1-9]?\d)(?=%)' file.txt

要安装 pregg,您可以从 here. To install it using macOS terminal check this link

下载它

sed 使用反向引用在一般替换形式的百分号前重新插入数字可能比 grep 更可行。例如你可以使用:

sed -E 's/^[^)]+\)\s+([0-9]+)%.*$//'

从开头匹配一个不是 ')' 的字符,然后是文字 ')',然后匹配任意数量的空格。捕获组开始捕获下一个 '%' 之前的数字,并丢弃到行尾的剩余字符。第一个反向引用 </code> 用于将整行替换为 <code>([0-9+)% 中的 (...) 之间捕获的内容。

例子Use/Output

$ echo "-InternalBattery-0 (id=7405667) 100%; charged; 0:00 remaining present: true" | 
sed -E 's/^[^)]+\)\s+([0-9]+)%.*$//'
100

awk解决方案

既然你在评论中提到你在 Apple Script 中尝试这样做(我对此知之甚少),那么也许 straight-forward awk 解决方案它只是循环查找包含 '%' 字符的字段,而不是 chops-off 从 '%' 到字段末尾的所有内容,打印结果并退出,例如

$ echo "-InternalBattery-0 (id=7405667) 100%; charged; 0:00 remaining present: true" | 
awk '{ for( i=1; i<=NF; i++) if ($i ~ /%/) { sub(/%.*$/,"",$i); print $i; exit }}'
100

这样您就可以再次使用 '%' 字符来识别文本字符串中的正确字段,然后简单地删除它以及后面的任何内容,并确信您得到的结果是正确的如果 '%' 在您的输入行中只出现一次。

试一试,如果您还有其他问题,请告诉我。

如果你可以使用 'grep' 和 '-P' 选项。

grep -Po '\d+(?=%)'