텍스트 문자열을 가정합니다.my_string
$ my_string="foo bar=1ab baz=222;"
baz
키워드와 세미콜론 사이의 영숫자 문자열을 추출하고 싶습니다 .
정규식 어설션을 사용하여 후행 세미콜론을 제외하도록 다음 grep 코드를 수정하려면 어떻게 해야 합니까?
$ echo $my_string | grep -oP '(?<='baz=').*'
222;
답변1
추출하려는 문자열 자체에 포함되어 있지 않은 경우 가장 간단한 방법은 ;
(단일 문자 일치)를 (제외한 모든 문자 일치)로 바꾸는 것입니다..
[^;]
;
$ printf '%s\n' "$my_string" | grep -oP '(?<='baz=')[^;]*'
222
grep
libpcre 7.2 이상에 연결 하면 다음을 사용하여 뒤돌아보기를 단순화할 수도 있습니다 \K
.
$ printf '%s\n' "$my_string" | grep -oP 'baz=\K[^;]*'
222
이는 일치하는 텍스트에 개행 문자가 포함되어 있지 않다고 가정하여 문자열의 모든 일치 항목을 인쇄합니다( grep
각 입력 줄은 개별적으로 처리되므로).
답변2
쉽게 매칭도 가능해요sed:
sed -n 's/.*baz=\([^;]*\).*/\1/p' <<< $my_string
222
답변3
Steeldriver의 답변은 정확하지만 가독성을 위해 다음을 수행합니다(사용 bash
).
my_string="foo bar=1ab baz=222;"
regex='baz=([0-9]+);'
[[ $my_string =~ $regex ]] &&
echo "${BASH_REMATCH[1]}"
답변4
POSIX 셸의 경우:
baz=
첫 번째 항목과 마지막 항목 사이에 있는 텍스트의 경우;
:my_string="foo bar=1ab baz=222;" case $my_string in (*baz=*\;*) result=${my_string#*baz=} result=${result%;*};; (*) result= esac
첫 번째 발생과
baz=
그 이후의 다음 발생 사이의 텍스트는 위의 내용으로 바꿉니다.;
%
%%
~을 위한마지막가 나타나면 로
baz=
바꾸십시오 .#
##