itsource

Bash에서 문자열에서 마지막 n자를 제거하려면 어떻게 해야 합니까?

mycopycode 2023. 4. 12. 22:22
반응형

Bash에서 문자열에서 마지막 n자를 제거하려면 어떻게 해야 합니까?

는 변수가 요.var"Bash" :

echo $var
"some string.rtf"

네 하고 그 변수인 '새 변수'에하고 싶습니다.var2

echo $var2
"some string"

이거 어떻게 해?

다음과 같이 할 수 있습니다(bash v4 이상).

#!/bin/bash

v="some string.rtf"

v2=${v::-4}

echo "$v --> $v2"

주의: 기본적으로 bash 3.x 를 사용합니다.

하려면 , 「 」를 사용합니다.${var%????}.

.${var%.*}.

자세한 내용은 매개 변수 확장에 대한 Bash 설명서를 참조하십시오.

첫째, 보통 자신의 의도를 분명히 하는 것이 좋습니다.이 '아'로 것을 '아'는 '아'로 끝납니다..rtf는, 「삭제」를 사용해 .var2=${var%.rtf}이 접근방식의 잠재적인 유용성의 한 가지 측면은 문자열이 로 끝나지 않는 경우입니다..rtf 않다; 전혀 변하지 않다.var2되지 않은 되어 있습니다.var.

그 신경 않는 는, 「」를 사용할 수 .var2=${var%.*} 제거하다.또는 모든 것을 최신 상태로 유지하고 첫 번째 데이터를 포함하지 않는 경우 . , 을 사용하면 .var2=${var%%.*} 이은 하나밖에에도 같은 ..스트링에 포함되지만 여러 개일 수 있는 경우 스트링의 어느 끝에서 작업할지를 선택할 수 있습니다. 만약 경우에는 '아예'라고 합니다..에는 아예 '''로 되어 .var2를 복사하다var.

특정 수의 문자를 항상 제거하려면 다음 옵션을 참조하십시오.

태그 bash배시 빌트인한 것과 서픽스 하려면 , 「」를 사용합니다.var2=${var%????} 첫 하려면 , 「」를 var2=${var%.???}은 '아예'와 같은 것입니다var2=${var%.*}그러나 점 뒤의 부분이 정확히 세 글자일 경우에만 접미사를 제거합니다.이렇게 문자를 카운트하려면 알 수 없는 문자당 물음표를 하나씩 삭제해야 합니다.따라서 서브스트링 길이가 클수록 이 접근법은 다루기 어려워집니다.

셸.서브스트링 추출은 다음과 같습니다.var2=${var:0:${#var}-4}에서는, 「 」, 「 」의 대신에 의 번호를 입력할 수4하다${#var}는 문자열의 길이로 대체되므로 실제로는 첫 번째 문자(인덱스0)부터 시작하여 (길이 - 4) 문자를 추출하여 유지하도록 요구됩니다.이 방법에서는 문자열이 패턴과 일치하는 경우에만 변경할 수 있습니다.문자열에 최소 4글자가 포함되어 있는 한 실제 값에 관계없이 복사본에는 마지막 4글자를 제외한 모든 문자가 포함됩니다.

할 수 이 .0으로 하다따라서 이 인덱스를 짧게 하면var2=${var::${#var}-4}실제로 bash의 새로운 버전(특히 MacOS에 탑재된 4+는 작동하지 않음)에서는 마이너스 길이를 문자열 끝부터 카운트백하여 정지할 문자의 인덱스로 인식합니다. 이러한 할 수 . string-length 표현은 string-length 표현입니다.var2=${var::-4}${#var}-4 3글자 입니다.${var:0:${#var}-4} becomes가 되다${var:0:-1}마지막 문자만 삭제합니다.

다른 POSIX 셸을 하고 있는 는, 「bash」를 사용한 패턴 와 「POSIX」를 사용합니다.%인덱스 기반 하위 문자열 추출이 불가능한 일반 오래된 대시에서도 여전히 작동합니다.Ksh와 zsh는 모두 서브스트링 추출을 지원하지만 명시적인0 시작 인덱스가 필요합니다.zsh는 음의 끝 인덱스를 지원하지만 ksh는 길이 식이 필요합니다. bash 호환 구문을 사용하면 1부터 시작하는 어레이를 인덱싱하는 zsh는 0부터 시작하는 문자열을 인덱싱합니다.그러나 zsh에서는 스칼라 파라미터를 문자 배열처럼 취급할 수도 있습니다.이 경우 서브스트링 구문은 1 베이스의 카운트를 사용하여 시작 위치와 끝 위치를 쉼표로 구분하여 괄호로 묶습니다.var2=$var[1,-5].

물론 내장된 셸 파라미터 확장을 사용하는 대신 일부 유틸리티 프로그램을 실행하여 문자열을 수정하고 명령어 대체로 출력을 캡처할 수 있습니다.수 명령어는 몇는 '일부러'입니다.하나는var2=$(sed 's/.\{4\}$//' <<<"$var").

나에게 효과가 있었던 것은, 다음과 같습니다.

echo "hello world" | rev | cut -c5- | rev
# hello w

근데 줄 자르는데 썼기 때문에 어색해 보여요.실제 용도는 다음과 같습니다.

cat somefile | rev | cut -c5- | rev

cut 일부 시작 위치에서만 트리밍할 수 있으므로 가변 길이 행이 필요한 경우 좋지 않습니다.따라서 이 솔루션은 문자열을 반전()rev하고, 이제 문자열의 끝 위치와 관련지어 언급한 대로 사용하고, 원래 순서로 되돌립니다(다시 한 번복합니다.

가변 확장/서브스트링 치환 사용:

${var/%Pattern/Replacement}

var 접미사가 Pattern과 일치하는 경우 Replacement for Pattern으로 대체하십시오.

다음과 같은 작업을 수행할 수 있습니다.

~$ echo ${var/%????/}
some string

또,

만약 당신이 항상 같은 4글자를 가지고 있다면

~$ echo ${var/.rtf/}
some string

그그 in면면 .xyz:

~$ echo ${var%.*}
some string

문자열의 길이를 사용할 수도 있습니다.

~$ len=${#var}
~$ echo ${var::len-4}
some string

간단히 말해서echo ${var::-4}

세드도 쓸 수 있고

sed 's/.\{4\}$//' <<< "$var"

예:

$ var="some string.rtf"
$ var1=$(sed 's/.\{4\}$//' <<< "$var")
$ echo $var1
some string

이것은 다음 작업도 할 수 있습니다.

... | head -c -1
-c, --bytes=[-]NUM
              print the first NUM bytes of each file; with the leading '-', print all but the last NUM bytes of each file

다음 예가 도움이 되기를 바랍니다.

echo ${name:0:$((${#name}-10))} --> ${name:start:len}

  • 위의 명령에서는 name이 변수입니다.
  • start의 시작점입니다.
  • len는 삭제할 문자열의 길이입니다.

예:

    read -p "Enter:" name
    echo ${name:0:$((${#name}-10))}

출력:

    Enter:Siddharth Murugan
    Siddhar

주의: Bash 4.2에서는 마이너스 서브스트링 지원이 추가되었습니다.

다음을 시도해보니 효과가 있었습니다.

#! /bin/bash

var="hello.c"
length=${#var}
endindex=$(expr $length - 4)
echo ${var:0:$endindex}

★★★★★hel

이 경우 삭제할 파일에 동일한 서픽스가 있다고 가정하여 basename을 사용할 수 있습니다.

예:

basename -s .rtf "some string.rtf"

그러면 "일부 문자열"이 반환됩니다.

접미사를 모르는 경우 마지막 점을 포함한 모든 접미사를 제거하려면 다음 절차를 따릅니다.

f=file.whateverthisis
basename "${f%.*}"

출력 "파일"

%는 잘라내기, .는 잘라내기, *는 와일드카드입니다.

mac os x에는 다른 버전의 bash가 포함되어 있기 때문에 위의 답변은 사용할 수 없습니다.

SED를 이렇게 써요.

var2=`echo $var2 | sed 's/.$//'`

마지막 문자를 삭제합니다.

var2=`echo $var2 | sed 's/..$//'`

는 마지막 2글자를 삭제합니다.

이것은 끈의 크기를 계산해서 나에게 효과가 있었다.
해야 할 .

removechars(){
        var="some string.rtf"
        size=${#var}
        echo ${var:0:size-4}  
    }
    removechars
    var2=$?

실타래

언급URL : https://stackoverflow.com/questions/27658675/how-to-remove-last-n-characters-from-a-string-in-bash

반응형