programing

Bash 문자열에서 고정 접두사/서픽스 제거

starjava 2023. 4. 17. 21:14
반응형

Bash 문자열에서 고정 접두사/서픽스 제거

문자열에서 접두사/서픽스를 제거하고 싶습니다.예를 들어 다음과 같습니다.

string="hello-world"
prefix="hell"
suffix="ld"

어떻게 하면 다음 결과를 얻을 수 있을까요?

"o-wor"
$ prefix="hell"
$ suffix="ld"
$ string="hello-world"
$ foo=${string#"$prefix"}
$ foo=${foo%"$suffix"}
$ echo "${foo}"
o-wor

이는 매뉴얼의 " 파라미터 확장" 섹션에 설명되어 있습니다.

${parameter#word}
${parameter##word}

이 단어는 패턴을 생성하기 위해 확장되며 아래에 설명된 규칙에 따라 일치합니다(패턴 일치 참조).패턴이 파라미터의 확장값의 선두와 일치하는 경우 확장 결과는 일치하는 패턴이 가장 짧은 파라미터의 확장값입니다.# 또는 패턴( 「」 「」 「」)을 지정합니다.##이치노[…]

${parameter%word}
${parameter%%word}

이 단어는 패턴을 생성하기 위해 확장되며 아래에 설명된 규칙에 따라 일치합니다(패턴 일치 참조).패턴이 파라미터의 확장된 값의 후행 부분과 일치하는 경우 확장 결과는 일치하는 패턴이 가장 짧은 파라미터 값입니다.% 또는 패턴( 「」 「」 「」)을 지정합니다.%%이치노[…]

sed 사용:

$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor

명령어 에서 sed는 'sed'입니다.^는 문자와 합니다.$prefix및 , " " "$" "로 끝나는 합니다.$suffix.

Adrian 는 아래의에서 몇 하고 있지만 Adrian Fruhworth는 과 같이 .sed매우 유용할 수 있습니다.$prefix와 $suffix의 내용이 sed에 의해 해석된다는 사실은 좋거나 나쁘거나 둘 중 하나입니다.주의만 하시면 됩니다.장점은 다음과 같은 작업을 수행할 수 있다는 것입니다.

$ prefix='^.*ll'
$ suffix='ld$'
$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor

bash 변수 치환보다 화려하고 강력합니다.스파이더맨의 말처럼 큰 책임이 따르는 것을 기억한다면, 당신은 괜찮을 것이다.

sed에 대한 간단한 소개는 http://evc-cit.info/cit052/sed_tutorial.html에서 찾을 수 있습니다.

셸과 그 문자열 사용에 관한 주의사항:

특정의 예에서는, 다음의 기능도 유효합니다.

$ echo $string | sed -e s/^$prefix// -e s/$suffix$//

...단, 이유:

  1. echo는 인수 목록에 몇 개의 문자열이 있는지 신경 쓰지 않습니다.
  2. $prefix 및 $suffix에는 공백이 없습니다.

명령줄에 공백이 포함되어 있더라도 명령어에 단일 인수로 표시되므로 일반적으로 문자열을 따옴표로 묶는 것이 좋습니다.같은 이유로 $prefix와 $suffix를 견적합니다.sed에 대한 각 편집 명령어는 하나의 문자열로 전달됩니다. 명령어는 그대로의 '따옴표'를 입니다. 작은따옴표를 사용했다면 sed 명령어는 문자 그대로를 얻었을 것입니다.$prefix그리고.$suffix우리가 원했던 건 확실히 아니었소

또한 변수를 설정할 때 작은 따옴표를 사용합니다.prefix그리고.suffix현에 있는 어떤 것도 해석하는 것을 원치 않기 때문에 보간 작업이 발생하지 않도록 한 번 인용합니다.다시 말씀드리지만, 이 예에서는 꼭 필요하지 않을 수도 있지만, 이것은 매우 좋은 습관입니다.

$ string="hello-world"
$ prefix="hell"
$ suffix="ld"

$ #remove "hell" from "hello-world" if "hell" is found at the beginning.
$ prefix_removed_string=${string/#$prefix}

$ #remove "ld" from "o-world" if "ld" is found at the end.
$ suffix_removed_String=${prefix_removed_string/%$suffix}
$ echo $suffix_removed_String
o-wor

주의:

#$substring : #을 추가하면 서브스트링 "hell"이 처음에 발견된 경우에만 삭제됩니다.%$substring : %를 추가하면 서브스트링 "ld"가 마지막에 발견된 경우에만 삭제됩니다.

이것이 없으면 "hell"과 "ld"의 서브스트링은 중간에 있는 경우에도 모두 제거됩니다.

패스로부터의 프리픽스 삭제에 GREP 를 사용하고 있습니다(에 의해 적절히 처리되지 않음).sed):

echo "$input" | grep -oP "^$prefix\K.*"

\K는 일치에서 앞에 있는 모든 문자를 삭제합니다.

접두사와 접미사의 길이를 알고 계십니까?고객님의 경우:

result=$(echo $string | cut -c5- | rev | cut -c3- | rev)

또는 일반:

result=$(echo $string | cut -c$((${#prefix}+1))- | rev | cut -c$((${#suffix}+1))- | rev)

하지만 Adrian Frühwirth의 솔루션은 매우 멋집니다!난 몰랐어!

소형 범용 솔루션:

expr "$string" : "$prefix\(.*\)$suffix"

연산자 사용:

$ string="hello-world"
$ prefix="hell"
$ suffix="ld"
$ [[ "$string" =~ ^$prefix(.*)$suffix$ ]] && echo "${BASH_REMATCH[1]}"
o-wor

참고: 2013년에는 가능할지 모르겠지만 오늘(2021년 10월 10일)에는 확실히 가능하므로 다른 옵션을 추가...


기존의 고정 길이의 스트링을 취급하고 있기 때문에(prefix ★★★★★★★★★★★★★★★★★」suffix을.bash원하는 결과를 얻기 위해 한 번의 작업으로 서브스트링을 수행합니다.

입력:

string="hello-world"
prefix="hell"
suffix="ld"

계획:

  • bash 구문: " " " " :${string:<start>:<length>}
  • prefix="hell"의 means, 리를 의미합니다.<start> 되다4
  • <length>의 총 길이가 될 것이다.string )${#string}길이 를 뺀 값입니다.4★★★★★★에hell2★★★★★★에ld)

다음과 같은 이점이 있습니다.

$ echo "${string:4:(${#string}-4-2)}"
o-wor

메모: 패런을 분리해도 같은 결과를 얻을 수 있습니다.


「 」의 .prefix ★★★★★★★★★★★★★★★★★」suffix수 할 수 있기 때문에 할 수 , 대신 사용할 수 있습니다.이러한 조작은 사용할 수 있습니다만, 치환할 수 있습니다.4 ★★★★★★★★★★★★★★★★★」2${#prefix} ★★★★★★★★★★★★★★★★★」${#suffix} , 각::

$ echo "${string:${#prefix}:${#string}-${#prefix}-${#suffix}}"
o-wor

@Adrian Frühworth를 사용하여 답변:

function strip {
    local STRING=${1#$"$2"}
    echo ${STRING%$"$2"}
}

이렇게 쓰다

HELLO=":hello:"
HELLO=$(strip "$HELLO" ":")
echo $HELLO # hello

언급URL : https://stackoverflow.com/questions/16623835/remove-a-fixed-prefix-suffix-from-a-string-in-bash

반응형