grep 정규식 어설션을 통해 문자열 추출

grep 정규식 어설션을 통해 문자열 추출

텍스트 문자열을 가정합니다.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

greplibpcre 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=바꾸십시오 .###

관련 정보