이 변수가 있는데 접두사와 접미사를 제거하고 싶습니다.
var="abcde"
echo "${${var#a}%e}"
나는 zsh에서 이 조각을 시도했고 잘 작동했습니다. 반환합니다 bcd
. 패턴 일치(접두사 및 접미사)를 사용합니다. 하지만 posix 호환 쉘 스크립트에서 실행하면(bash 문자열 조작 대신 패턴 일치를 사용하는 이유) 출력이 bad substitution
.
무슨 일이야? 저장할 다른 변수를 만들어야 합니까 "${var#a}"
, 아니면 한 줄로 완료할 수 있습니까? 나는 posix 호환 스크립트를 원합니다.
답변1
아니요, 다른 변수는 필요하지 않습니다. 예, 한 줄로 할 수 있습니다.
이것은 아마도 가장 이식 가능한 솔루션이지만 변수 값을 덮어씁니다(여전히 질문에 언급된 단일 변수를 사용함). 이는 쉘 언어의 매개변수 확장만 사용합니다.
var="abcde"
var="${var#a}" # remove prefix
echo "${var%e}" # remove suffix
한 줄의 코드 생성은 항상 다음과 같습니다.
var="abcde"; var="${var#a}"; echo "${var%e}"
변수를 덮어쓰고 싶지 않다면 함수 매개변수는 완벽한 임시 변수입니다. 예제는 간단하지만 사용된 추가 변수를 숨기는 함수를 만들 수 있습니다. 이 접근 방식은 POSIX 셸에 지역 변수가 없기 때문에 특히 유용합니다.
# this function runs in a subshell, so all new variables are lost on the return
remove_pre_post() (
local_var="${1#a}" # uses the first argument
echo "${local_var%e}"
)
var="abcde"
remove_pre_post "$var" # call function
또 다른 POSIX 호환 솔루션에는 다음이 포함될 수 있습니다 sed
.
var="abcde"
echo "$var" | sed 's/^a//; s/e$//'
패턴 일치 없이 예시만 제공했습니다. 패턴 일치가 중요해지면 패턴의 복잡성에 따라 한 솔루션이 다른 솔루션보다 더 나은 것으로 보일 수 있다는 점을 명심하세요.