Bash文字列操作の実践ガイド – 文字数の取得・部分文字列の抽出・検索・置換
Bashシェルでは、ドル記号($)に変数名を続けて記述すると、シェルがその変数を実際の値に展開します。この機能は「パラメータ展開」と呼ばれています。
しかし、パラメータ展開にはこれ以外にもさまざまな形式が用意されており、パラメータを展開しながら値を加工したり、展開の過程で別の値に置き換えたりすることも可能です。本記事では、パラメータ展開の仕組みを活用した文字列操作のテクニックを詳しく解説します。
なお、この記事は継続中のBashチュートリアルシリーズの一部です。関連記事として「bash { } 展開」についての解説もぜひ参照してください。
1. Bashシェルスクリプトで文字列の長さを取得する
${#string}
上記の形式を使用すると、指定したbash変数の文字数(長さ)を取得できます。
$ cat len.sh
#! /bin/bash
var="Welcome to the geekstuff"
echo ${#var}
$ ./len.sh
24
この例では、変数varに格納された文字列の長さ「24」が出力されます。bash変数についてさらに詳しく知りたい方は、「6 Practical Bash Global and Local Variable Examples」の記事も参考になります。
2. Bashシェルスクリプトで変数から部分文字列を抽出する
Bashには、文字列から部分文字列を抽出するための便利な構文が用意されています。次の例では、特定の位置から指定した文字数を取り出す方法を説明します。
${string:position}
$stringの$positionで指定した位置以降の部分文字列を抽出します。
${string:position:length}
$stringの$positionで指定した位置から、$lengthで指定した文字数分の部分文字列を抽出します。以下の例では、最初のecho文が15番目の位置以降の部分文字列を返し、2番目のecho文が15番目の位置から4文字分を返しています。なお、lengthには0以上の数値を指定する必要があります。
$ cat substr.sh
#! /bin/bash
var="Welcome to the geekstuff"
echo ${var:15}
echo ${var:15:4}
$ ./substr.sh
geekstuff
geek
また、$*、$@、$#、$$、$!、$?、$-、$_といったbash特殊パラメータについては、以前の解説記事を参照してください。
3. 最短マッチによる部分文字列の削除
次の構文は、$stringの先頭から$substringの最短マッチを削除します。
${string#substring}
次の構文は、$stringの末尾から$substringの最短マッチを削除します。
${string%substring}
以下のサンプルシェルスクリプトで、この2つの最短マッチの概念を確認してみましょう。
$ cat shortest.sh
#! /bin/bash
filename="bash.string.txt"
echo "After deletion of shortest match from front:" ${filename#*.}
echo "After deletion of shortest match from back:" ${filename%.*}
$ ./shortest.sh
After deletion of shortest match from front: string.txt
After deletion of shortest match from back: bash.string
最初のecho文では、パターン「*.」が文字列とドットにマッチし、「#」が文字列の先頭から削除を行うため、変数filenameから「bash.」という部分が取り除かれます。2番目のecho文では、パターン「.*」がドットで始まる部分にマッチし、「%」が文字列の末尾から削除を行うため、「.txt」が削除されます。
4. 最長マッチによる部分文字列の削除
次の構文は、$stringの先頭から$substringの最長マッチを削除します。
${string##substring}
次の構文は、$stringの末尾から$substringの最長マッチを削除します。
${string%%substring}
以下のサンプルシェルスクリプトで、この2つの最長マッチの概念を確認してみましょう。
$ cat longest.sh
#! /bin/bash
filename="bash.string.txt"
echo "After deletion of longest match from front:" ${filename##*.}
echo "After deletion of longest match from back:" ${filename%%.*}
$ ./longest.sh
After deletion of longest match from front: txt
After deletion of longest match from back: bash
上記の例では、「##*.」が「*.」に対する最長マッチ、つまり「bash.string.」に一致する部分を先頭から削除するため、残りの「txt」が出力されます。同様に「%%.*」は末尾から「.*」に対する最長マッチ、つまり「.string.txt」に一致する部分を削除するため、「bash」が返されます。
5. Bashシェルスクリプトで文字列の検索と置換を行う
最初のマッチのみを置換する
${string/pattern/replacement}
$stringの中でpatternにマッチする部分を探し、最初のマッチだけをreplacementに置き換えます。
$ cat firstmatch.sh
#! /bin/bash
filename="bash.string.txt"
echo "After Replacement:" ${filename/str*./operations.}
$ ./firstmatch.sh
After Replacement: bash.operations.txt
すべてのマッチを置換する
${string//pattern/replacement}
patternにマッチするすべての箇所をreplacementに置き換えます。
$ cat allmatch.sh
#! /bin/bash
filename="Path of the bash is /bin/bash"
echo "After Replacement:" ${filename//bash/sh}
$ ./allmatch.sh
After Replacement: Path of the sh is /bin/sh
検索と置換に関連する話題として、sedによる置換の実例やVimでの検索・置換に関する以前の記事も参考になります。
先頭と末尾のみを置換する
${string/#pattern/replacement}
この構文は、patternが$stringの先頭にマッチした場合にのみ、replacementに置き換えます。
${string/%pattern/replacement}
この構文は、patternが$stringの末尾にマッチした場合にのみ、replacementに置き換えます。
$ cat posmatch.sh
#! /bin/bash
filename="/root/admin/monitoring/process.sh"
echo "Replaced at the beginning:" ${filename/#\/root/\/tmp}
echo "Replaced at the end": ${filename/%.*/.ksh}
$ ./posmatch.sh
Replaced at the beginning: /tmp/admin/monitoring/process.sh
Replaced at the end: /root/admin/monitoring/process.ksh
おすすめの学習リソース
Ramesh Natarajan著『Bash 101 Hacks』。筆者は日々Linux環境で作業をしており、自然とBashのコマンドラインやシェルスクリプティングの熱心なファンになりました。15年前にさまざまな*nix系OSに携わっていた頃は、CシェルやKornシェルで大量のコードを書いていました。その後、システム管理者としてLinuxの仕事を始めてからは、あらゆるタスクをBashシェルスクリプトで自動化するようになりました。こうしたBashの経験をもとに、コマンドライン操作とシェルスクリプティング両方の実用的な101の例を収録した電子書籍『Bash 101 Hacks』を執筆しました。Bashをマスターしたいと考えているなら、ぜひ本書を読んで、Bashのコマンドラインとシェルスクリプティングを自在に操れるようになりましょう。
-
Notepad++で文字列・文字・記号を検索して改行に置き換える方法
Notepad++(ノートパッドプラスプラス)は、プログラマーが快適な環境でソースコードを編集するために広く利用されている無料のテキストエディタです。Windows標準のメモ帳の高機能版にあたり、多数のプログラミング言語に対応しているほか、ソースコードやテキスト編集に役立つ豊富な機能とツールを備えています。テキストファイルの編集中に、特定の場所へ新しい行(改行)を挿入したくなることもあるでしょう。ただし、改行への置き換えを行うには、事前にいくつかのオプションを適切に設定しておく必要があります。この記事では、Notepad++の「検索と置換」機能を使って改行を挿入する方法を詳しく解説します。文字
-
Bash変数チュートリアル – 基本からグローバル変数・ローカル変数まで学べる6つの実用例
Bash変数は、プログラムの実行期間中に必要となる情報を一時的に保存しておくための仕組みです。本記事はBashチュートリアルシリーズの一篇で、他のプログラミング言語と同様にBashでも変数を利用できることを踏まえ、基本的な使い方からグローバル変数とローカル変数の違いまでを、6つの実用的なサンプルを通じて解説します。 Bash変数の基本構文 変数の定義は非常にシンプルで、次の書式に従います。 VARNAME=VALUE 注意: 変数へ代入する際は、「=」記号の前後にスペースを入れてはいけません。「VAR=VALUE」のように書けば、シェルは「=」を代入記号として認識し、この行を変数への代入とし