내 bash
스크립트에는 문자열과 접두사 / 접미사가 있습니다. 원래 문자열에서 접두사 / 접미사를 제거해야합니다.
예를 들어 다음과 같은 값이 있다고 가정 해 봅시다.
string="hello-world"
prefix="hell"
suffix="ld"
다음 결과를 얻으려면 어떻게합니까?
result="o-wor"
내 bash
스크립트에는 문자열과 접두사 / 접미사가 있습니다. 원래 문자열에서 접두사 / 접미사를 제거해야합니다.
예를 들어 다음과 같은 값이 있다고 가정 해 봅시다.
string="hello-world"
prefix="hell"
suffix="ld"
다음 결과를 얻으려면 어떻게합니까?
result="o-wor"
답변:
$ foo=${string#"$prefix"}
$ foo=${foo%"$suffix"}
$ echo "${foo}"
o-wor
${${string#prefix}%suffix}
했지만 작동하지 않습니다.
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$//
...하지만 다음과 같은 이유로 만 :
공백이 포함되어 있어도 단일 인수로 명령에 표시되므로 명령 행에서 문자열을 인용하는 것이 좋습니다. 동일한 이유로 $ prefix와 $ suffix를 인용합니다. sed에 대한 각 편집 명령은 하나의 문자열로 전달됩니다. 큰 따옴표는 변수 보간을 허용하기 때문에 사용합니다. 우리가 나오지 명령이 문자를받은 것 작은 따옴표를 사용했다 $prefix
그리고 $suffix
우리가 원하는 것을 확실히이다.
공지 사항, 너무 작은 따옴표 내 사용은 변수를 설정할 때 prefix
와 suffix
. 우리는 확실히 문자열의 어떤 것도 해석하기를 원하지 않으므로 보간이 일어나지 않도록 작은 따옴표로 묶습니다. 다시이 예제에서는 필요하지 않을 수도 있지만 들어가는 것은 좋은 습관입니다.
$string
단어 분리 및 글 로빙의 대상이됩니다. 2) $prefix
및 $suffix
식을 포함 할 수있는 sed
정규 표현식 또는 전체 명령을 깰 것이다 구분 기호로 사용되는 문자를 예 해석됩니다. 3) sed
두 번의 호출 은 필요하지 않으며 ( -e 's///' -e '///'
대신 가능) 파이프도 피할 수 있습니다. 예를 들어 string='./ *'
and 및 / prefix='./'
또는를 고려 하여 1)
and 로 인해 심각 하게 중단되는 것을 확인하십시오 2)
.
/
사용 sed "s#^$prefix##
했습니다. ( #
신뢰도 : 파일 이름은을 (를) 포함 할 수 없습니다 . 파일을 제어하므로 안전합니다.)
#
sed의 구분자 로 사용할 선택의 제한으로 인해 해당 문자가 포함 된 파일을 처리 할 수 없다는 의미입니다.
접두사와 접미사의 길이를 알고 있습니까? 귀하의 경우 :
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
일치하기 전에 모든 문자를 제거합니다.
grep -P
비표준 확장입니다. 플랫폼에서 지원되는 경우 더 많은 기능을 사용할 수 있지만 코드를 이식성이 좋으면 모호한 조언입니다.
grep
. 이전 버전은 실제로 -P
BSD 의 옵션이 grep
있었지만 제거했습니다.
$ 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"
$ set +H # Disables history substitution, can be omitted in scripts.
$ perl -pe "s/${prefix}((?:(?!(${suffix})).)*)${suffix}/\1/" <<< $string
o-wor
$ string1=$string$string
$ perl -pe "s/${prefix}((?:(?!(${suffix})).)*)${suffix}/\1/g" <<< $string1
o-woro-wor
((?:(?!(${suffix})).)*)
의 내용이 ${suffix}
캡처 그룹에서 제외되도록합니다. 예를 들어, 문자열은에 해당합니다 [^A-Z]*
. 그렇지 않으면 얻을 것이다 :
$ perl -pe "s/${prefix}(.*)${suffix}/\1/g" <<< $string1
o-worldhello-wor