매개변수 확장을 사용하면 다음과 같은 선행 공백을 제거할 수 있습니다.
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
.