zsh 매개변수 확장 시 문자열 시작 부분에서 일치하는 항목 수를 제거하세요.

zsh 매개변수 확장 시 문자열 시작 부분에서 일치하는 항목 수를 제거하세요.

매개변수 확장을 사용하면 다음과 같은 선행 공백을 제거할 수 있습니다.

stripped_var=${original_var#[[:blank:]]}

##최소 일치 대신 최대 일치를 허용하는 데 익숙 #하지만 패턴을 "공백 1개"에서 "공백 수"로 변환하는 방법을 찾지 못했습니다.

값에서 모든 선행 공백을 제거하기 위해 여러 일치 항목을 허용하는 방법이 있습니까 original_var? 이상적으로는 하위 프로세스/하위 쉘 시작을 포함하지 않는 솔루션을 찾고 있습니다. 즉, awk, sed 등이 없는 솔루션을 선호하지만 매개변수 확장이 트릭을 수행하지 못하는 경우에는 그것도 그렇고)

답변1

당신이 사용할 수있는확장된 전역 연산자 x#:

x#
(설정하려면 EXTENDED_GLOB가 필요합니다.) 패턴 x가 0개 이상 일치합니다. 이 연산자는 우선순위가 높습니다. "12#"은 "(12)#"이 아니라 "1(2#)"와 같습니다. 반복할 수 없는 항목 뒤에 따옴표가 없는 '#'은 오류입니다. 여기에는 KSH_GLOB 패턴의 일부인 경우 빈 문자열, 패턴 뒤에 '##' 또는 괄호가 포함됩니다(예: '!(foo)#'). 유효하지 않으며 '*(!(foo)) ')로 바꿔야 합니다.

setopt extended_glob
stripped_var=${original_var##[[:blank:]]#}

답변2

~처럼@프레디가 언급됨, 이 패턴을 regexp 's 또는 's와 동일하게 zsh사용할 수 있습니다 .[[:blank:]]#[[:blank:]]*ksh*([[:blank:]])

하지만 POSIXly에서는 다음과 같이 할 수도 있습니다.

stripped_var=${orginal_var#"${original_var%%[![:blank:]]*}"}

동등한 경우 awk '{$1=$1};1', 즉 선행 및 후행 공백을 제거하고 공백 시퀀스를 단일 공백으로 압축하면 다음을 수행할 수 있습니다.

var=$'  a    b\tc\t\td\t \n\n'
stripped_var=${${=var}}

(여기서는 $stripped_var가 됩니다 "a b c d"). 즉, $IFS분할을 수행하고 다시 스칼라로 변환하여 요소를 의 첫 번째 문자와 연결합니다 $IFS.

관련 정보