문자열 정규식 busybox 사이에서 문자열 추출

문자열 정규식 busybox 사이에서 문자열 추출

BusyBox에서 정규식을 사용하여 두 문자열 사이에서 문자열을 추출하려고 합니다. 현지에서 할 수 있었어요

extract_string=$(echo $content | grep -P '(?<=CURRENT_VERSION ")(.*)(?=")' -o)

불행하게도 이 BusyBox 버전의 grep명령은 이 -P옵션을 지원하지 않습니다. sed, awk및 을 사용할 수 있습니다 grep.

끈:#define CURRENT_VERSION "1.0.0.2" some other random text

산출:1.0.0.2

내가 이것을 달성할 수 있는 다른 방법을 아는 사람이 있습니까?

운영 체제:커널 2.6.x

유용:비지박스 1.2x에서

답변1

그리고 sed:

extract_string=$(
  printf '%s\n' "$content" |
    sed -n 's/.*CURRENT_VERSION "\([^"]*\).*/\1/p'
)

그리고 awk:

extract_string=$(
  printf '%s\n' "$content" |
    awk -F'"' '/CURRENT_VERSION/{ print $2 }'
)

답변2

추출할 텍스트가 변수 내부에 있으므로 sed, awk 또는 cut과 같은 외부 명령을 호출하면 실제로 처리 시간이 낭비됩니다.

동등한 정규식을 여러 셸(ksh, bash, zsh)에서 사용할 수 있습니다.

re='CURRENT_VERSION "(.*)".*'
[[ $content =~ $re ]] && echo "${BASH_REMATCH[1]}"

쉘에 이러한 기능이 없으면 다음을 사용하십시오.

out1=${content#*\"}; out2=${out1%\"*}
[[ ${content} -ne ${#out1} ]] && 
    [[ ${#out1} -ne ${#out2} ]] &&
        echo "$out2"

최종 테스트에서는 둘 다 "문자열에 변경 사항을 생성했는지 확인한 다음 추출된 문자열만 인쇄합니다.

"그러면 첫 번째와 마지막 사이의 텍스트가 출력됩니다 ".

답변3

cut다음을 사용하여 이 작업을 수행 할 수 있습니다.awk

content='#define CURRENT_VERSION "1.0.0.2" 다른 임의의 텍스트'

cut:

extract_string=$(echo $content|cut -d '"' -f2)

awk:

extract_string=$(echo $content|awk '{for(i=1;i<=NF;i++)if($i~/CURRENT_VERSION/)print $(i+1)}')

관련 정보