쉘 변수에서 선행 및 후행 공백을 제거하는 방법

쉘 변수에서 선행 및 후행 공백을 제거하는 방법

선행 및 후행 공백이 있는 tablename이라는 변수가 있습니다(예:

tablename= yyy 

). 선행 및 후행 공백을 제거하고 싶습니다(출력:

tablename=yyy

) 그리고 쉘 스크립트를 사용하여 공백을 남기지 않고 이 변수를 파일에 씁니다.

답변1

var='    A  B C  '

그리고 zsh:

trim=${${var%${var##*[^[:blank:]]}}#${${var%${var##*[^[:blank:]]}}%%[^[:blank:]]*}}
printf '++%s++\n' $trim
++AB C++

그리고 bash:

shopt -s extglob
trim=${var%%*([[:blank:]])}
trim=${trim##*([[:blank:]])}
printf '++%s++\n' "$trim"
++AB C++

모든 셸에 대해 추가 변수를 사용하여 선행 및 후행 공백을 보유할 수 있습니다1 ( 기본적으로 동일한 솔루션이지만 zsh중첩되지 않음):

trail=${var##*[^[:blank:]]}    # get trailing space
var=${var%${trail}}            # remove trailing space
lead=${var%%[^[:blank:]]*}     # get leading space
trim=${var#${lead}}            # remove leading space
printf '++%s++\n' "$trim"
++AB C++

1: 명확하게 하기 위해 여기서는 두 개의 변수를 사용하여 선행 공백과 후행 공백을 별도로 유지하지만 하나의 변수가 가능합니다.

답변2

주어진대로다른 사이트의 게시물:

tablename=${tablename// }

답변3

read명령은 선행 및 후행 공백 문자를 다듬습니다( 값으로 정의됨 IFS). 공백을 다듬기 위해 여기 문서와 함께 사용할 수 있습니다.

IFS=' ' read tablename <<EOF
$tablename
EOF

bash(X 쉘 브랜드 아님)를 사용하는 경우 여기에 있는 문서 대신 여기에 있는 문자열을 사용하여 이를 단순화할 수 있습니다.

IFS=' ' read tablename <<<"$tablename"

이 할당은 $IFS명령의 접두사 이므로 read해당 명령에만 적용되며 나중에 재설정할 필요가 없습니다. 또한, 혼란스럽지 않고 $IFS탭과 공백을 잘라내고 싶다면 IFS전혀 설정할 필요가 없습니다.

답변4

echo "tablename =yyy" | tr -d ' '
tablename=yyy

관련 정보