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