Unix Shell에서 가장 짧은 부분 문자열 일치의 개념은 무엇입니까?

Unix Shell에서 가장 짧은 부분 문자열 일치의 개념은 무엇입니까?

가장 짧은 하위 문자열 일치를 위해 문자열 처리에 다음 스크립트를 사용하고 있습니다.

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의 왼쪽에 놓을 때를 보세요 .. 이 표기법은 모든 것을 첫 번째 지점까지 자릅니다.

관련 정보