변수의 하위 문자열을 바꾸는 방법은 무엇입니까?

변수의 하위 문자열을 바꾸는 방법은 무엇입니까?

문자열 변수에서 문자를 제거하려고 합니다. sed나에게는 다음과 같습니다 .

MYVAR=--23ho02123ware38384you443d34o3434ingtod38384day-%§*#sfrf
echo ${MYVAR} | sed -e 's/[a-z][a-z0-9\-]*//g'

나는 얻다:

 --23%§*#

이것이 내가 찾고 있는 것입니다. 문자열은 문자로 시작해야 하며 문자, 숫자, 대시(-)만 포함해야 합니다. bash문자열 교체를 통해 이를 달성할 수 있는 방법이 있습니까 ?

MYVAR=${MYVAR/[a-z][a-z0-9-]*/ }

여러 가지 조합을 시도했지만 그 중 어느 것도 예상한 대로 작동하지 않았습니다.

답변1

동등한 정규식을 얻으려면 ksh 확장 glob 연산자( bashwith shopt -s extglob및 with 에서 zsh사용할 수 있는 하위 집합)를 사용해야 합니다 (비록 다른 구문을 사용하더라도 해당 항목은 여기에서 ).set -o kshglob*(x)x*

shopt -s extglob # for bash
# set -o kshglob # for zsh
printf '%s\n' "${MYVAR//[[:alpha:]]*([[:alnum:]-])/}"

또는 zsh extendedglobs를 사용하십시오. 여기서 정규 표현식과 동등한 것은 다음과 *같습니다 #.

set -o extendedglob
printf '%s\n' ${MYVAR//[[:alpha:]][[:alnum:]-]#}

몇 가지 참고사항:

  • ${var/pattern/replacement}첫 번째 발생만 대체됩니다. 모든 항목을 바꾸는 데 사용됩니다 ( 명령의 ${var//pattern/replacement}' 플래그와 마찬가지로 ).gseds
  • 대체 문자를 공백으로 설정했습니다. ${var//pattern/}(또는 )을 사용하여 ${var//pattern}빈 문자열로 바꾸세요.
  • echo임의의 문자열을 출력하는 데 사용하고 싶지 않습니다.
  • 를 제외하고 zsh,목록 컨텍스트의 변수 확장은 인용되어야 합니다.
  • sed변수에 개행 문자가 포함되어 있으면 동작이 메서드와 다릅니다.
  • [a-z]a및 (일부 도구의 요소 조합)로 구성된 문자와 일치합니다 z. 이 목록은 로케일, 시스템 및 도구에 따라 다릅니다(예를 들어 GNU 시스템의 로케일은 [a-z], , 와 일치하지만 일치하지 않음). 일반적으로 영어 알파벳의 소문자 26자를 포함하지만 반드시 그런 것은 아닙니다. 고려 중인 문자(또는 조합 요소)를 포함합니다.bash-4.3en_GB.UTF-8AXéZ[[:alpha:]]알파벳순으로(대소문자 관계없이) 귀하의 로케일에서. 영문 26자만 일치시키려면 [abcdefghijklmnopqrstuvwxyz]또는를 사용하여 로케일을 C( LC_ALL=C)로 고정하고 영문 소문자에만 or를 [a-z]사용 하거나 모든 영문자에 /를 사용하세요.[[:lower:]][a-zA-Z][[:alpha:]]
  • [a-z0-9\-]in은 sed백슬래시 문자와 일치합니다. [a-z0-9-]대신 사용하십시오( -문자 그대로 사용하려면 첫 번째 또는 마지막이어야 함).

관련 정보