가장 짧은 하위 문자열 일치를 위해 문자열 처리에 다음 스크립트를 사용하고 있습니다.
filename="bash.string.txt"
echo ${filename#*.}
다음과 같은 출력이 제공됩니다.
string.txt
위의 예에 대한 설명은 다음과 같습니다(링크:https://www.thegeekstuff.com/2010/07/bash-string-manipulation):
위의 예에서는 $string 앞에 있는 $substring의 가장 짧은 일치 항목을 제거합니다. 첫 번째 echo 문에서 하위 문자열 '*.'은 문자 및 점과 일치하며 #은 문자열 앞에서 제거되므로 하위 문자열 "bash"가 제거됩니다. filename이라는 변수에서.
그런 다음 코드를 다음과 같이 변경했습니다.
filename="bashshell.string.txt"
echo ${filename#*.}
방금 첫 번째 문자열을 확장했습니다.불다.도착하다bashshell. 위에 제공된 설명에 따라 "bashshell.txt"가 출력될 것으로 예상합니다. 그러나 첫 번째 예와 동일한 결과가 나타납니다.
즉string.txt
그렇다면 제가 이 개념을 오해하고 있는 걸까요? 그렇다면 실제로 어떻게 작동합니까?
답변1
이 튜토리얼에서 "하위 문자열"이라는 용어를 사용하는 것은 약간 오해의 소지가 있습니다. 사용시 ${variable#pattern}
매칭 및 삭제를 처리하고 있습니다.접두사 문자열( ${variable%pattern}
그리고접미사 문자열).
*.
bash.string.txt
두 문자열 sums 에서 가장 짧은 접두사 문자열 일치를 제거 합니다 bashshell.string.txt
. string.txt
패턴이 *.
문자열의 첫 번째 지점(포함)과 일치 하므로 두 문자열의 결과는 동일합니다 .
POSIX 표준이 특정 매개변수 확장을 정의하세요.~처럼
${parameter#[word]}
최소 접두사 패턴을 제거합니다. 이것단어생산을 확대해야 함무늬. 매개변수 확장으로 인해범위, 일치하는 접두사의 가장 작은 부분무늬삭제되었습니다. 존재하는 경우 단어는 따옴표 없이 시작되어서는 안 됩니다
#
.
결과를 얻으려면 bashshell.txt
문자열을 삭제 .string
하거나 string.
문자열 중간에서 제거해야 합니다. 이는 표준 매개변수 확장을 통해 두 단계로 수행될 수 있습니다.
suffix=${filename##*.} # remove everything to the *last* dot
echo "${filename%%.*}.$suffix" # remove everything from the first dot and add suffix
매개변수 확장 ##
및 변경이 제거되었습니다.%%
가장 긴접두사 및 접미사 문자열을 각각 일치시킵니다.
또는 다음을 사용하십시오 bash
.
echo "${filename/string./}"
그러면 값(첫 번째 항목) 내에서 지정된 문자열이 제거됩니다 $filename
.
답변2
그렇다면 제가 이 개념을 오해하고 있는 걸까요? 그렇다면 실제로 어떻게 작동합니까?
예, 이 표기법은 ${var#*.}
문자열의 시작 부분부터 문자 포인트( )까지 .
모든 것을 제거합니다. 그것은 당신이 원하는 것을 하고 있습니다. 당신의 패턴은 스타포인트입니다:
*.
따라서 문자열 시작 부분(단어 뒤의 지점)부터 첫 번째 지점까지의 모든 항목을 일치시킵니다 bash
.
bash.string.txt
^---------------- it's splitting here
예
$ str="bash.string.txt"
$ echo "${str#*.}"
string.txt
$ str="bash1.string.txt"
$ echo "${str#*.}"
string.txt
$ str="bash1.string1.txt"
$ echo "${str#*.}"
string1.txt
1을 1st의 왼쪽에 놓을 때를 보세요 .
. 이 표기법은 모든 것을 첫 번째 지점까지 자릅니다.