Linux で Bash 文字列に部分文字列が含まれているかどうかを確認する方法
公開: 2022-09-21Linux スクリプトでは、テキストの文字列に特定の短い文字列が含まれているかどうかを知りたい場合があります。 これを行うには多くの方法があります。 シンプルで信頼性の高いテクニックを紹介します。
これが役立つ理由
文字列から小さな部分文字列を検索することは、一般的な要件です。 1 つの例として、ファイルまたは人間の入力からテキストを読み取り、その文字列で特定の部分文字列を検索して、スクリプトが次に何をすべきかを決定できるようにすることがあります。 構成ファイル内のラベルまたはデバイス名、またはユーザーからの入力行内のコマンド文字列を探している可能性があります。
Linux ユーザーは、テキストを操作するためのユーティリティをいくつでも利用できます。 Bash シェルに組み込まれているものもあれば、スタンドアロンのユーティリティまたはアプリケーションとして提供されているものもあります。 Unix 由来のオペレーティング システムが文字列操作機能を豊富に備えているのには理由があります。
ファイルのように見えるものは、単純なファイルではありません。 これらは、ハードウェア デバイスやシステム情報のソースなどを表す特別なファイルです。 オペレーティング システムによって実行される抽象化により、ファイルの外観と特性が与えられます。 それらから情報を (もちろんテキストとして) 読み取ることができ、場合によってはそれらに書き込むこともできますが、それらは通常のファイルではありません。
テキストは、ターミナル ウィンドウでのコマンドの入力および出力としても使用されます。 これにより、入力と出力のリダイレクトとパイプが可能になります。 この機能は、一連の Linux コマンドを連結して、あるコマンドの出力を入力として次のコマンドに渡す機能を支えています。
その起源に関係なく、受け取ったテキストを検索して重要な単語、コマンド、ラベル、またはその他のインジケーターを見つけることは、テキストベースのデータを扱う際の標準的な部分です。 これは、独自のスクリプトに組み込むことができる簡単な手法のコレクションです。
Bashビルトインで部分文字列を見つける
二重括弧 " [[...]]
" 文字列比較テストをif
ステートメントで使用して、ある文字列に別の文字列が含まれているかどうかを判断できます。
このスクリプトをエディターにコピーし、「double.sh」という名前のファイルに保存します。
#!/ビン/バッシュ [[ "サル" = *"キー"* ]]; それから echo "キーはサルにあります" そうしないと echo "キーがサルにありません" フィ
chmod
コマンドでスクリプトを実行可能にする必要があります。 これは、スクリプトを実行可能にするために常に必要な手順です。 これは、スクリプト ファイルを作成するたびに行う必要があります。 いずれの場合も、適切なスクリプトの名前に置き換えてください。
chmod +x double.sh
スクリプトを実行してみましょう。
./double.sh
これが機能するのは、アスタリスク「 *
」が文字なしを含む任意の文字列を表すためです。 部分文字列「key」がターゲット文字列内にある場合、その前後に文字があってもなくても、テストは true を返します。
この例では、部分文字列の前に文字があります。 これらは最初のアスタリスクで一致します。 部分文字列の後ろに文字はありませんが、アスタリスクも文字と一致しないため、テストは成功します。
柔軟性のために、リテラル文字列の代わりに変数を処理するようにスクリプトを変更できます。 これがスクリプト「double2.sh」です。
#!/ビン/バッシュ 文字列="モンキー" サブストリング="キー" if [[ $string = *$substring* ]]; それから echo "$string で $substring が見つかりました" そうしないと echo "$substring は $string に見つかりませんでした" フィ
それがどのように実行されるか見てみましょう。
./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
case
ステートメントでも、部分文字列をアスタリスクで囲むというトリックを使用できます。 これが「case.sh」です。
#!/ビン/バッシュ shopt -s nocasematch 文字列="ワラビー" サブストリング="壁" ケース $string で *$substring*) echo "$string で $substring が見つかりました" ;; *) echo "一致するものはありません: $string" ;; エサック
非常に長いif
ステートメントの代わりにcase
ステートメントを使用すると、スクリプトが読みやすく、デバッグしやすくなります。 文字列に多くの可能な部分文字列の 1 つが含まれているかどうかを確認する必要がある場合は、 case
ステートメントが最適です。
./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
による標準出力への書き込みを停止しています。
括弧「 (...)
」内のコマンドの結果がゼロの場合、一致が見つかったことを意味します。 Bash ではゼロはtrue
に等しいため、 if
ステートメントが満たされ、 then
句が実行されます。
その出力が何であるかを見てみましょう。
./subgrep.sh
sed による部分文字列の検索
sed
を使用して部分文字列を見つけることもできます。
デフォルトでは、 sed
はフィードされたすべてのテキストを出力します。 sed -n
を使用すると、これが防止されます。 印刷される行は一致する行だけです。 この式は、$substring の値に一致する、または値を含むすべての行を出力します。
"/$substring/p"
here リダイレクト<<<
を使用して、 $string
の値を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
$substring
の値を編集して比較が失敗するようにすることで、スクリプトのロジックをテストできます。
./subsed.sh
検索をやめて、見つけました
awk
やPerl
などの他のツールは部分文字列を見つけることができますが、部分文字列を見つけるような単純な使用例では、追加の機能や追加の複雑さは保証されません。 特に、Bash ビルトインを使用して部分文字列を検索することは、高速かつ簡単で、外部ツールを必要としません。
関連: Bash スクリプトで Case ステートメントを使用する方法