如何从字符串中提取没有“%”符号的百分比数字?
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+(?=%)'
-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+(?=%)'