1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェル文字列傍受の実装方法(非常に詳細)

2022-02-07 08:17:39

Shellは、指定した位置からと指定した文字(部分文字列)からという2つの方法で文字列を傍受しています。

指定位置からの迎撃

この方法では、2つのパラメータが必要です。開始位置を指定することに加えて、インターセプトする文字列を確定するためにインターセプト長も必要です。

開始位置を指定する必要があるため、文字列の左側から数えるのか、それとも右側から数えるのか、という問題があります。答えは、Shellはどちらの数え方にも対応しています。

1) 文字列の左側から数えた場合

文字列の左側から数えたい場合は、傍受した文字列の正確な書式は次のようになります。

${string: start :length}

ここで、stringはインターセプトする文字列、startは開始位置(左から0から数える)、lengthはインターセプトする文字列の長さ(文字列の終わりまで行くことを示すために省略)です。


url="jb51.net"
echo ${url: 2: 9}


結果はビアンチェンです。

さらに例を挙げます。

url="jb51.net"
echo ${url: 2} #Omit length, intercept to end of string


その結果がbiancheng.netです。

2) 右から数える

文字列の右側から数えたい場合は、傍受した文字列の正確なフォーマットは次のようになります。

${string: 0-start :length}


フォーマット1)と比較して、フォーマット2)は0-が追加されているだけです。これは固定で、特に文字列の右側から数えることを示すために使用されます。

ここで、2つの点を強調する必要がある。

  • 左から数えるときは0から(これはプログラマの思考と一致する)、右から数えるときは1から(これは一般的な思考と一致する)です。数える方向が違うので、開始番号も違う。
  • 切片の方向は、どちらから数え始めても左から右です。


url="jb51.net"
echo ${url: 0-13: 9}


右から数えて、bは13文字目です。

さらに例を挙げると

url="jb51.net"
echo ${url: 0-13} #Omit length and intercept directly to the end of the string


その結果がbiancheng.netです。

指定された文字(部分文字列)からインターセプトする

このタイプの傍受は、文字列の長さを指定することができず、指定した文字(部分文字列)から文字列の終わりまでしか傍受できません。 shellは、指定した文字(部分文字列)の右側のすべての文字と左側のすべての文字を傍受することができます。

1) # 記号で右の文字を挟み込む

記号を使用すると、指定した文字(または部分文字列)の右側にあるすべての文字を、次の形式で傍受することができます。

${string#*chars}


ここで、string は傍受する文字、chars は指定された文字(または部分文字列)、* はワイルドカードの一種で、任意の長さの文字列を表します。*chars を併用すると、chars に出会うまで左側の文字をすべて無視することになります(chars はインターセプトされません)。

次の例をご覧ください。

url="http://jb51.net/index.html"
echo ${url#*:}


結果は //jb51.net/index.html です。

と書いても同じ結果が得られます。

echo ${url#*p:}
echo ${url#*ttp:}


の左側の文字を無視する必要がない場合は、*を省いて、例えば

url="http://jb51.net/index.html"
echo ${url#http://}


結果は、jb51.net/index.htmlです。

上記の書き出しは、最初にマッチする文字(部分文字列)に遭遇した時点で終了することに注意してください。例えば

url="http://jb51.net/index.html"
echo ${url#*/}


結果は、/jb51.net/index.htmlです。URL文字列には3つの/があり、出力はシェルが最初に遭遇した/でマッチを終了したことを示しています。

指定した最後の文字(部分文字列)までマッチを終了させたい場合は、## の形式で使用します。

${string##*chars}


次の例をご覧ください。

#! /bin/bash
url="http://jb51.net/index.html"
echo ${url#*/} #result for /jb51.net/index.html
echo ${url##*/} #result for index.html
str="---aa+++aa@@@@"
echo ${str#*aa} # The result is +++aa@@@@
echo ${str##*aa} #results in @@@


2) % を使って左文字を切り捨てる

指定した文字(または部分文字列)の左側にあるすべての文字を次の形式で傍受するには、%記号を使用します。

${string%chars*}


の位置に注意してください。charsの左側の文字を傍受し、charsの右側の文字を無視したいので、*はcharsの右側にあるはずです。その他、%や#も同じなので、ここでは説明しませんが、一例として。

#! /bin/bash
url="http://jb51.net/index.html"
echo ${url%/*} #results in http://jb51.net
echo ${url%%/*} #result for http:
str="---aa+++aa@@@@"
echo ${str%%aa*} #result for ---aa+++
echo ${str%%aa*} #result is ---


集計

最後に、上記8つのフォーマットのまとめとして、以下の表をご覧ください。

<テーブル 形式 説明 文字列: 開始 :長さ} ${文字列: 開始 :長さ 文字列の左側の開始文字から、右側の文字列の長さをインターセプトする。 文字列: 開始}。 文字列の左側の開始文字から終了文字までをインターセプトする。 ${string: 0-開始 :長さ}の場合 文字列の右側の開始文字から、その文字列の長さをインターセプトする。 ${string: 0-開始} 文字列の右側の開始点から始まり、終了点まで続く。 文字列#*chars}を指定します。 文字列の中で*charsが最初に現れる位置から、*charsの右側にあるすべての文字を取る。 文字列##*chars}を表示します。 文字列の中で *chars が最後に現れた位置から、*chars の右側にあるすべての文字を取る。 文字列%*chars}を返します。 文字列の中で*charsが最初に現れる位置から、*charsの左側にあるすべての文字を取る。 文字列%%*chars}を表示します。 文字列の中で*charsが最後に現れた位置から、*charsの左側にあるすべての文字をインターセプトする。

これは、シェルの文字列インターセプトを実装する方法(非常に詳細)についてのこの記事の終わりです、より関連するシェルの文字列インターセプトの内容は、House of Scriptsの以前の記事を検索するか、次の関連記事を閲覧を続けてくださいHouse of Scriptsをサポートしてくれることを願っています!...