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


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

我想在上面的字符串上做egrep -ow (regex),只得到100%100,而不得到其他。我该怎么做?

sed在一般替换形式中使用backrefere在百分号之前重新插入数字可能比grep更可行。例如,您可以使用:

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

它从一开始就匹配一个或多个不是')'的字符,然后匹配一个文字')',然后匹配任意数量的空白。捕获组开始捕获直到下一个'%'的数字,并丢弃行尾的剩余字符。第一个反向参考CCD_ 9用于用在CCD_ 11中的CCD_。

示例使用/输出

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

Awk解决方案

由于在您提到的注释中,您正在Apple Script中尝试此操作(我对此知之甚少(,因此可能是一个直接的awk解决方案,它只需循环查找包含'%'字符的字段,然后截断从'%'到字段末尾的所有内容,打印结果并退出,例如

$ 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+(?=%)'

您可以使用pcregrep检查字符串前面是否有一到三个带边界的数字,并提前查找百分比字符:

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

要安装pcreg,您可以从这里下载。要使用macOS终端安装它,请检查此链接

最新更新