[bash] Bash의 문자열에서 고정 접두사 / 접미사 제거

bash스크립트에는 문자열과 접두사 / 접미사가 있습니다. 원래 문자열에서 접두사 / 접미사를 제거해야합니다.

예를 들어 다음과 같은 값이 있다고 가정 해 봅시다.

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

다음 결과를 얻으려면 어떻게합니까?

result="o-wor"



답변

$ foo=${string#"$prefix"}
$ foo=${foo%"$suffix"}
$ echo "${foo}"
o-wor


답변

sed 사용하기 :

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

sed 명령 내에서 ^ 문자는로 시작하는 텍스트와 $prefix후행을 찾습니다.$ 일치 은로 끝나는 텍스트와 일치합니다 $suffix.

Adrian Frühwirth는 아래 의견에서 몇 가지 좋은 점을 지적하지만 sed 이 목적으로 매우 유용 할 수 있습니다. $ prefix와 $ suffix의 내용이 sed에 의해 해석된다는 사실은주의를 기울이는 한 좋거나 나쁠 수 있습니다. 아름다움은 다음과 같이 할 수 있다는 것입니다.

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

이것은 당신이 원하는 것일 수 있으며, bash 변수 대체보다 더 강력하고 강력합니다. Spiderman이 말한 것처럼 큰 힘으로 큰 책임을진다는 것을 기억한다면 괜찮을 것입니다.

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에 대한 각 편집 명령은 하나의 문자열로 전달됩니다. 큰 따옴표는 변수 보간을 허용하기 때문에 사용합니다. 우리가 나오지 명령이 문자를받은 것 작은 따옴표를 사용했다 $prefix그리고 $suffix우리가 원하는 것을 확실히이다.

공지 사항, 너무 작은 따옴표 내 사용은 변수를 설정할 때 prefixsuffix. 우리는 확실히 문자열의 어떤 것도 해석하기를 원하지 않으므로 보간이 일어나지 않도록 작은 따옴표로 묶습니다. 다시이 예제에서는 필요하지 않을 수도 있지만 들어가는 것은 좋은 습관입니다.


답변

접두사와 접미사의 길이를 알고 있습니까? 귀하의 경우 :

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솔루션은 멋지다! 나는 그것에 대해 몰랐다!


답변

경로에서 접두사를 제거하기 위해 grep을 사용합니다 (으로 잘 처리되지 않음 sed).

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

\K 일치하기 전에 모든 문자를 제거합니다.


답변

$ 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

노트:

# $ prefix : #을 추가하면 하위 문자열 “hell”이 처음에 발견 된 경우에만 제거됩니다. % $ suffix : %를 추가하면 하위 문자열 “ld”가 끝에있는 경우에만 제거됩니다.

이것 없이는 “hell”과 “ld”라는 부분 문자열이 중간에서 발견 되더라도 모든 곳에서 제거됩니다.


답변

=~연산자 사용 :

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


답변

작고 보편적 인 솔루션 :

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