문자열의 마지막 문자를 제거하고 싶습니다. 다음 작은 스크립트를 사용해 보았습니다.
#! /bin/sh
t="lkj"
t=${t:-2}
echo $t
그런데 "lkj"가 인쇄됩니다. 내가 뭘 잘못하고 있는 걸까요?
답변1
bash
버전 4.2 이상 에서는 다음을 수행할 수 있습니다.
${var::-1}
예:
$ a=123
$ echo "${a::-1}"
12
이전 버전 bash
(예: bash 3.2.5
OS X)에서는 콜론 사이와 뒤에 공백을 유지해야 합니다.
${var: : -1}
답변2
POSIX 셸에서는 구문의 의미가 다릅니다. 가 ${t:-2}
설정되어 있고 null이 아닌 경우 값으로 확장되고, 그렇지 않으면 값으로 확장됩니다. 매개변수 확장을 통해 단일 문자를 자르려면 필요한 구문은 다음과 같습니다.t
t
2
${t%?}
ksh93
, bash
또는 zsh
, ${t:(-2)}
또는 ${t: -2}
(공백에 주의하세요 )예부분 문자열 확장으로는 적법하지만 끝에서 2문자로 시작하는 부분 문자열을 반환하므로 원하는 것이 아닐 수도 있습니다.첫 번째i
문자열의 문자 ijk
).
자세한 내용은 Bash 참조 매뉴얼의 Shell Parameter Expansion 섹션을 참조하세요.
답변3
sed를 사용하면 작동합니다
sed 's/.$//'
미혼이에요에코그게 다야 echo ljk | sed 's/.$//'
.
이 기능을 사용하면 단선 문자열의 크기에 제한이 없습니다.
답변4
쉘에 따른 일부 옵션:
- POSIX:
t=${t%?}
- 번:
t=`expr " $t" : ' \(.*\).'`
- 지쉬/야쉬:
t=${t[1,-2]}
- 배쉬/zsh:
t=${t:0:-1}
- ksh93/bash/zsh/mksh:
t=${t:0:${#t}-1}
- ksh93/bash/zsh/mksh:
t=${t/%?}
- ksh93:
t=${t/~(E).$/}
- 예:
@ {t=$1} ~~ $t *?
모든 항목에서 마지막 항목을 제거해야 하지만특징, 일부 구현(멀티바이트 문자를 지원하지 않는 구현)은 마지막 문자를 제거한다는 것을 알 수 있습니다.바이트반대로(마지막 문자가 멀티바이트인 경우 손상될 수 있음)
이 expr
변형은 $t
여러 줄 바꿈으로 끝나지 않는다고 가정합니다. 또한 결과 문자열이 0
(또는 000
일부 -0
구현에서는) 종료되면 0이 아닌 종료 상태를 반환합니다. 문자열에 잘못된 문자가 포함된 경우 예기치 않은 결과가 발생할 수도 있습니다.