답변:
먼저, 당신이 원하는 것에 대해 명시해야합니다. 문자열이 끝나고을 .rtf
제거하려는 경우을 .rtf
사용할 수 있습니다 var2=${var%.rtf}
. 접미사가 무엇인지 모르지만 마지막으로 시작하는 모든 것을 제거 .
하려면을 사용할 수 있습니다 var2=${var%.*}
. 모든 것을 처음에만 유지 .
하려면 사용할 수 있습니다 var2=${var%%.*}
. 마지막 두 옵션은 기간이 하나만 있으면 동일한 결과를 갖지만 둘 이상이있을 경우 원하는 것을 결정해야합니다.
항상 정확한 수의 문자를 제거하려면 몇 가지 옵션이 있습니다.
bash를 구체적으로 지정 했으므로 bash 내장으로 시작할 것입니다. 가장 오래 일한 것은 위에서 사용한 것과 동일한 접미사 제거 구문 var2=${var%????}
입니다. 네 문자를 제거하려면을 사용하십시오 . 제거 된 문자 당 하나의 물음표가 필요하므로 더 큰 부분 문자열 길이에서는 다루기가 어려워집니다.
부분 문자열 추출은 약간 더 최신입니다 : var2=${var::${#var}-4}
. 여기 4
에 다른 수의 문자를 제거하기 위해 대신 숫자를 입력 할 수 있습니다 . ( ${#var}
문자열의 길이로 대체되므로 실제로 첫 번째 (길이-4) 문자를 유지하도록 요청합니다.)
최신 버전의 bash (특히 4 이상, MacOS와 함께 제공되는 버전은 작동하지 않음)를 사용하면 단순화 할 수 있습니다 var2=${var::-4}
.
실제로 bash를 사용하지 않고 다른 POSIX 유형 쉘을 사용하는 경우 접미사 제거는 평범한 오래된 대시 (나머지가없는 곳)에서도 여전히 작동합니다. zsh에서는 모두 작동하지만 0
콜론 사이에 공백 을 넣어야합니다 . var2=${var:0:-4}
etc. ksh에서는 0이 필요하며 명시적인 길이 -4 표현식도 사용해야합니다 var2=${var:0:${#var}-4}
.
물론 유틸리티 프로그램의 도움으로 명령 대체를 사용할 수 있습니다. 효과가 충분하지만 var2=$(cut -c -4 <<<"$var")
아마도 가장 짧은 옵션 일 것입니다.
당신은 이렇게 할 수 있습니다 :
#!/bin/bash
v="some string.rtf"
v2=${v::-4}
echo "$v --> $v2"
bash
4+하지만, 이전 버전에서 당신은 약간 더 사용할 수 있습니다 ${v::${#v}-4}
.
${v::-4}
croaks에서 "zsh : 닫기 괄호 예상". 그러나 @fredtantini의 답변은 아래에서 ${v:0:-4}
잘 작동합니다.
문자열 끝에서 네 문자를 제거하려면을 사용하십시오 ${var%????}
.
최종 .
사용 후 모든 것을 제거 합니다 ${var%.*}
.
${var#????}
합니다.
나를 위해 일한 것은 다음과 같습니다.
echo "hello world" | rev | cut -c5- | rev
# hello w
그러나 파일에서 줄을 자르는 데 사용했기 때문에 어색해졌습니다. 실제 용도는 다음과 같습니다.
cat somefile | rev | cut -c5- | rev
cut
일부 시작 위치에서 트리밍하는 것만 가능합니다. 가변 길이 행이 필요한 경우 좋지 않습니다. 따라서이 솔루션 rev
은 문자열을 뒤집고 ( ) 이제 끝 위치와 관련이 있으며 cut
언급 한대로 사용 하고 rev
원래 순서로 되돌립니다 (다시 ).
rev
문자열이 아닌 행을 반대로합니다. echo $SOME_VAR | rev | ...
아마 사람이 어떻게 기대하는지 행동하지 않을 것입니다.
사용 변수 확장 / 하위 문자열 교체 :
$ {var / % Pattern / Replacement}
var의 접미사가 Pattern과 일치하면 Replace를 Pattern으로 대체하십시오.
그래서 당신은 할 수 있습니다 :
~$ echo ${var/%????/}
some string
또는
항상 같은 4 글자가 있다면
~$ echo ${var/.rtf/}
some string
항상 끝나는 경우 .xyz
:
~$ echo ${var%.*}
some string
문자열 길이를 사용할 수도 있습니다.
~$ len=${#var}
~$ echo ${var::len-4}
some string
또는 단순히 echo ${var::-4}
len=${#var}; echo ${var::len-4}
echo ${var:0:-4}
:-) 편집 으로 단축 될 수 있습니다 : 또는 @ iyonizer가 지적했듯이 그냥 echo ${var::-4}
...
sed를 사용할 수 있습니다.
sed 's/.\{4\}$//' <<< "$var"
예:
$ var="some string.rtf"
$ var1=$(sed 's/.\{4\}$//' <<< "$var")
$ echo $var1
some string
var2
어떻게 할당 합니까?
아래 예제가 도움이되기를 바랍니다.
echo ${name:0:$((${#name}-10))}
-> ${name:start:len}
start
문자열 시작점입니다len
제거해야하는 문자열의 길이입니다.예:
read -p "Enter:" name
echo ${name:0:$((${#name}-10))}
산출:
Enter:Siddharth Murugan
Siddhar
참고 : Bash 4.2는 음의 하위 문자열에 대한 지원을 추가했습니다.