문자열이 있습니다.
Identities = 99/100 (99%) total 0/0 (0%)
99%
(첫 번째 괄호 안의 숫자)만 추출하고 는 추출하지 않으려면 어떻게 해야 합니까 0
?
답변1
사용 awk
:
awk -F '[()]' '{print $2}' <<< "$string"
산출:
99%
(...)
참고: 이는 실제로 무엇이든 관계없이 첫 번째 내의 모든 항목을 출력합니다 .
답변2
문자열이 쉘 변수에 있는 경우 첫 번째 십진수 시퀀스를 추출한 다음 %
.
그리고 zsh
:
$ string='Identities = 99/100 (99%) total 0/0 (0%)'
$ print ${(MS)string#<->%}
99%
(또는 <1->%
null이 아닌 첫 번째 백분율을 추출하려는 경우)
그리고 bash
:
$ string='Identities = 99/100 (99%) total 0/0 (0%)'
$ [[ $string =~ [0123456789]+% ]] && echo "$BASH_REMATCH"
99%
(또는 0*[123456789][0123456789]*%
null이 아닌 첫 번째 비율).
POSIX적으로:
awk -- '
BEGIN{
if (match(ARGV[1], /[0123456789]+%/))
print substr(ARGV[1], RSTART, RLENGTH)
}' "$string"
(다시 0*[123456789][0123456789]*%
null이 아닌 첫 번째 비율).
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"
~ 와 같이 앞에 0이 있는 항목도 일치시키려면 [1-9]
로 변경하세요.[0-9]
0%
00%
09%
[0-9]
거의 모든 직책은 하나의 숫자에만 일치합니다.
[0-9]?
동일한 1 또는 0과 일치합니다. [0123456789]
영어/ASCII 숫자만 일치시키려면 로 바꾸십시오.
답변4
이렇게 하면 원하는 결과를 얻는 데 도움이 됩니다.
방법 1:
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%