I have a string:
Identities = 99/100 (99%) total 0/0 (0%)
How do I extract just the 99%
(number within first parenthesis) but not the 0
?
答案1
Using awk
:
awk -F '[()]' '{print $2}' <<< "$string"
Output:
99%
Note: This will actually output anything within the first (...)
, no matter what it is.
答案2
如果该字符串位于 shell 变量中,则提取第一个十进制数字序列,后跟%
.
和zsh
:
$ string='Identities = 99/100 (99%) total 0/0 (0%)'
$ print ${(MS)string#<->%}
99%
(或者<1->%
如果您想提取第一个非空百分比)
和bash
:
$ string='Identities = 99/100 (99%) total 0/0 (0%)'
$ [[ $string =~ [0123456789]+% ]] && echo "$BASH_REMATCH"
99%
(或0*[123456789][0123456789]*%
第一个非空百分比)。
POSIXly:
awk -- '
BEGIN{
if (match(ARGV[1], /[0123456789]+%/))
print substr(ARGV[1], RSTART, RLENGTH)
}' "$string"
(同样0*[123456789][0123456789]*%
是第一个非空百分比)。
对于bash
POSIX 和 POSIX,$string
必须包含您所在区域中的有效文本。
答案3
string='Identities = 99/100 (99%) total 0/0 (0%)'
grep -oP '^.*?\(\K([0-9][0-9]?(\.[0-9]+)?|100)%(?=\))' <<<"$string"
请注意,这将返回在(...)
第一个找到的模式无效的情况下找到的第一个有效百分比,如果将返回下一个希望。
这会提取与上述相同模式匹配的字符串中所有可能的百分比:
grep -Po '(?<=\()([1-9][0-9]?(\.[0-9]+)?|100)%(?=\))' <<<"$string"
如果您还想匹配那些带有前导零的内容,例如~ ,请更改[1-9]
为。[0-9]
0%
00%
09%
[0-9]
几乎所有位置仅匹配单个数字。
[0-9]?
匹配相同的一或零;[0123456789]
如果您只想匹配英文/ASCII 数字,请将其替换为。
答案4
这将帮助您获得所需的输出
方法一:
var='Identities = 99/100 (99%) total 0/0 (0%)'
echo ${var#*(} | sed -E 's/%*$/ /g' | sed 's/).*//'
输出 :
99%
方法2:
echo "Identities = 99/100 (99%) total 0/0 (0%) #*)" | sed -E 's/%*$/ /g' | sed 's/).*//' | cut -d'(' -f2
输出 :
99%