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$//
...단, 이유:
- echo는 인수 목록에 몇 개의 문자열이 있는지 신경 쓰지 않습니다.
- $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
★★★★★★에hell
2
★★★★★★에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
'programing' 카테고리의 다른 글
어떤 SQL 쿼리가 더 빠릅니까?가입 조건 또는 장소 절에 따라 필터링하시겠습니까? (0) | 2023.04.17 |
---|---|
셸 스크립트의 인스턴스를 한 번에 하나만 실행할 수 있는 빠르고 더러운 방법 (0) | 2023.04.17 |
파일을 일괄 정렬하는 방법 (0) | 2023.04.17 |
변수에 값을 할당하는 한 줄씩 파일 줄 읽기 (0) | 2023.04.17 |
각 디렉토리의 파일 수를 어떻게 계산합니까? (0) | 2023.04.17 |