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.txt2つの文字列sumsから最短の接頭辞文字列の一致を削除しますbashshell.string.txtstring.txtパターンは*.文字列の最初の点(含む)と一致するため、両方の文字列の結果は同じです。

POSIX規格この特定のパラメータ拡張を定義してください。〜のように

${parameter#[word]}

最小プレフィックスパターンを削除します。これ言葉生産を拡大する必要がある模様。パラメータ拡張のため範囲、一致するプレフィックスの最小部分模様削除されました。存在する場合、単語は引用符なしで始まってはいけません#

結果を得るには、bashshell.txt文字列を削除する.stringか、string.文字列の途中から削除する必要があります。これは標準パラメータ拡張を介して2段階で行うことができます。

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の左側に置く時を見てください.。この表記法はすべてを最初のポイントまで切り捨てます。

関連情報