Linux で Bash 文字列に部分文字列が含まれているかどうかを確認する方法

公開: 2022-09-21
bash プロンプトを表示している Linux ラップトップ
Fatmawati achmad zaenuri/Shutterstock.com

Linux スクリプトでは、テキストの文字列に特定の短い文字列が含まれているかどうかを知りたい場合があります。 これを行うには多くの方法があります。 シンプルで信頼性の高いテクニックを紹介します。

これが役立つ理由

文字列から小さな部分文字列を検索することは、一般的な要件です。 1 つの例として、ファイルまたは人間の入力からテキストを読み取り、その文字列で特定の部分文字列を検索して、スクリプトが次に何をすべきかを決定できるようにすることがあります。 構成ファイル内のラベルまたはデバイス名、またはユーザーからの入力行内のコマンド文字列を探している可能性があります。

Linux ユーザーは、テキストを操作するためのユーティリティをいくつでも利用できます。 Bash シェルに組み込まれているものもあれば、スタンドアロンのユーティリティまたはアプリケーションとして提供されているものもあります。 Unix 由来のオペレーティング システムが文字列操作機能を豊富に備えているのには理由があります。

Linux 上の Bash で文字列を操作する方法
関連Linux 上の Bash で文字列を操作する方法

ファイルのように見えるものは、単純なファイルではありません。 これらは、ハードウェア デバイスやシステム情報のソースなどを表す特別なファイルです。 オペレーティング システムによって実行される抽象化により、ファイルの外観と特性が与えられます。 それらから情報を (もちろんテキストとして) 読み取ることができ、場合によってはそれらに書き込むこともできますが、それらは通常のファイルではありません。

テキストは、ターミナル ウィンドウでのコマンドの入力および出力としても使用されます。 これにより、入力と出力のリダイレクトとパイプが可能になります。 この機能は、一連の Linux コマンドを連結して、あるコマンドの出力を入力として次のコマンドに渡す機能を支えています。

その起源に関係なく、受け取ったテキストを検索して重要な単語、コマンド、ラベル、またはその他のインジケーターを見つけることは、テキストベースのデータを扱う際の標準的な部分です。 これは、独自のスクリプトに組み込むことができる簡単な手法のコレクションです。

Bashビルトインで部分文字列を見つける

二重括弧 " [[...]] " 文字列比較テストをifステートメントで使用して、ある文字列に別の文字列が含まれているかどうかを判断できます。

このスクリプトをエディターにコピーし、「double.sh」という名前のファイルに保存します。

 #!/ビン/バッシュ

[[ "サル" = *"キー"* ]]; それから
  echo "キーはサルにあります"
そうしないと
  echo "キーがサルにありません"
フィ
Linux で二重括弧条件テストを使用する方法
関連Linux で二重括弧条件付きテストを使用する方法

chmodコマンドでスクリプトを実行可能にする必要があります。 これは、スクリプトを実行可能にするために常に必要な手順です。 これは、スクリプト ファイルを作成するたびに行う必要があります。 いずれの場合も、適切なスクリプトの名前に置き換えてください。

 chmod +x double.sh 

chmod でスクリプトを実行可能にする

スクリプトを実行してみましょう。

 ./double.sh 

double.sh スクリプトの実行

これが機能するのは、アスタリスク「 * 」が文字なしを含む任意の文字列を表すためです。 部分文字列「key」がターゲット文字列内にある場合、その前後に文字があってもなくても、テストは true を返します。

この例では、部分文字列の前に文字があります。 これらは最初のアスタリスクで一致します。 部分文字列の後ろに文字はありませんが、アスタリスクも文字と一致しないため、テストは成功します。

柔軟性のために、リテラル文字列の代わりに変数を処理するようにスクリプトを変更できます。 これがスクリプト「double2.sh」です。

 #!/ビン/バッシュ

文字列="モンキー"
サブストリング="キー"

if [[ $string = *$substring* ]]; それから
  echo "$string で $substring が見つかりました"
そうしないと
  echo "$substring は $string に見つかりませんでした"
フィ

それがどのように実行されるか見てみましょう。

 ./double2.sh 

double2.sh スクリプトの実行

これは同じように機能しますが、リテラル文字列の代わりに変数名を使用できるという利点があります。 私たちの小さなソリューションを関数に変えると、最も柔軟になります。

これがスクリプト「double3.sh」です。

 #!/ビン/バッシュ

shopt -s nocasematch

文字列="モンキー"
サブストリング="キー"
首都="ロンドン"

check_substring ()
{
if [[ $1 = *$2* ]]; それから
  echo "$2 が $1 で見つかりました"
そうしないと
  echo "$2 は $1 に見つかりませんでした"
フィ
}

check_substring "モンキー" "キー" 
check_substring $string $substring
check_substring $string "バナナ"
check_substring "ウェールズ" $capital

変数とリテラル文字列を組み合わせてcheck_substring関数を呼び出します。 -s (設定) オプションを指定してshoptを使用してnocasematchを設定し、大文字と小文字を区別しないようにしました。

実行方法は次のとおりです。

 ./double3.sh 

double3.sh スクリプトの実行

caseステートメントでも、部分文字列をアスタリスクで囲むというトリックを使用できます。 これが「case.sh」です。

 #!/ビン/バッシュ

shopt -s nocasematch

文字列="ワラビー"
サブストリング="壁"

ケース $string で

  *$substring*)
    echo "$string で $substring が見つかりました"
    ;;

  *)
    echo "一致するものはありません: $string"
    ;;
エサック

非常に長いifステートメントの代わりにcaseステートメントを使用すると、スクリプトが読みやすく、デバッグしやすくなります。 文字列に多くの可能な部分文字列の 1 つが含まれているかどうかを確認する必要がある場合は、 caseステートメントが最適です。

 ./case.sh 

case.sh スクリプトの実行

部分文字列が見つかりました。

grep による部分文字列の検索

Bash ビルトインを超えて、おそらく最初に到達するテキスト検索ツールはgrepです。 grepの本来の機能を使用して、文字列内の文字列を検索し、部分文字列を探すことができます。

このスクリプトは「subgrep.sh」と呼ばれます。

 #!/ビン/バッシュ

string="おかゆ鍋"
部分文字列="尾根"

if $(echo $string | grep -q $substring); それから
  echo "$string で $substring が見つかりました"
そうしないと
  echo "$substring は $string に見つかりませんでした"
フィ

スクリプトはechoを使用して、部分文字列を検索するgrepに文字列を送信します。 -q (quiet) オプションを使用して、 grepによる標準出力への書き込みを停止しています。

Linux で grep コマンドを使用する方法
関連Linux で grep コマンドを使用する方法

括弧「 (...) 」内のコマンドの結果がゼロの場合、一致が見つかったことを意味します。 Bash ではゼロはtrueに等しいため、 ifステートメントが満たされ、 then句が実行されます。

その出力が何であるかを見てみましょう。

 ./subgrep.sh 

subgrep.sh スクリプトの実行

sed による部分文字列の検索

sedを使用して部分文字列を見つけることもできます。

デフォルトでは、 sedはフィードされたすべてのテキストを出力します。 sed -nを使用すると、これが防止されます。 印刷される行は一致する行だけです。 この式は、$substring の値に一致する、または値を含むすべての行を出力します。

 "/$substring/p"

here リダイレクト<<<を使用して、 $stringの値をsedにフィードします。 これは、現在のシェルで値をコマンドにリダイレクトするために使用されます。 パイプのようにサブシェルを呼び出すことはありません。

Linux で sed コマンドを使用する方法
関連Linux で sed コマンドを使用する方法

最初の-nはテストです。 sedコマンドからの出力がゼロ以外の場合、 trueを返します。 sedからの出力がゼロ以外になる唯一の方法は、一致する行が見つかった場合です。 その場合、 $substring$stringで見つかったに違いありません。

これが「subsed.sh」です。

 #!/ビン/バッシュ

string="スウェーデン"
サブストリング="エデン"

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; それから
  echo "$string で $substring が見つかりました"
そうしないと
  echo "$substring は $string に見つかりませんでした"
フィ

スクリプトを実行すると、期待どおりの応答が得られます。

 ./subsed.sh 

subsed.sh スクリプトの実行

$substringの値を編集して比較が失敗するようにすることで、スクリプトのロジックをテストできます。

./subsed.sh

一致しない部分文字列を使用して subsed.sh スクリプトを実行する

検索をやめて、見つけました

awkPerlなどの他のツールは部分文字列を見つけることができますが、部分文字列を見つけるような単純な使用例では、追加の機能や追加の複雑さは保証されません。 特に、Bash ビルトインを使用して部分文字列を検索することは、高速かつ簡単で、外部ツールを必要としません。

関連: Bash スクリプトで Case ステートメントを使用する方法