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

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

문자열 변수에서 문자를 제거하려고 합니다. 그것은 다음과 같이 나에게 효과적입니다 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 extglobzshwith with 에서 사용 가능)를 사용해야 합니다 (다른 구문을 사용하더라도 여기 에 해당함 ).set -o kshglob*(x)x*

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

또는 zsh extendedglob정규 표현식과 동등한 s를 사용하면 다음과 *같습니다 #.

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

몇 가지 참고사항:

  • ${var/pattern/replacement}첫 번째 발생만 대체합니다. ${var//pattern/replacement}모든 발생을 바꾸는 데 사용합니다 (예: 's 명령 g의 플래그 ).seds
  • 대체 문자를 공백 문자로 만들었습니다. ${var//pattern/}(또는 )을 사용하여 ${var//pattern}빈 문자열로 바꾸세요.
  • echo임의의 문자열을 출력하는 데 사용하고 싶지 않습니다.
  • 를 제외하고 zsh,목록 컨텍스트의 변수 확장은 인용되어야 합니다.
  • sed변수에 개행 문자가 포함된 경우 동작은 접근 방식과 다를 수 있습니다 .
  • [a-z]a및 사이에 포함된 문자(일부 도구의 조합 요소)와 일치합니다 z. 목록은 로케일, 시스템 및 도구에 따라 다릅니다(예를 들어 GNU 시스템의 로케일에서는 , , , 와 일치 [a-z]하지만 bash-4.3는 일치 하지 않음 ) . 여기에는 일반적으로 영어 알파벳의 소문자 26개가 포함되지만 반드시 그런 것은 아닙니다. 고려되는 문자(또는 조합 요소)를 포함합니다.en_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-]대신 사용하십시오( -문자 그대로 받아들이려면 문자가 처음이거나 마지막이어야 합니다).

관련 정보