グループ化と後方参照
正規表現には、複数の文字をひとまとめにして扱う「グループ化」という機能があります。かっこでくくった部分は量指定子をまとめて効かせられるだけでなく、後から \1 \2 という番号で呼び出せる「後方参照」の対象にもなります。特にsedの置換では、探した部分の一部をそのまま新しい形に組み込めるので、機械的な書き換えがぐっと楽になります。BREとEREでかっこの書き方が違う点も、ここで一緒に整理します。
ここまでの量指定子は「直前の1文字」にしか効かなかった。abc* なら * が効くのは c だけで、abc全体を繰り返す指定はできない。
実務ではこの壁に何度もぶつかる。ログイン失敗のログで user1user1 のように同じ語が連続する行だけ拾いたい、あるいは 1500円 という金額表記をまとめて 1500 JPY に直したい、といった場面では「1文字だけ」の指定では手が届かない。
この壁を越えるのが「グループ化」だ。かっこで複数文字をひとまとめにすると、そのかたまり全体に量指定子をかけられるようになる。
拡張正規表現(ERE)では (abc)+ と書けば abc というかたまりが1回以上繰り返すパターンになる。abcabcabc にも abc 単体にもマッチする。
ここで思い出したいのが以前の回で見たBREとEREの違いだ。EREでは ( ) がそのまま特殊文字として働くが、BRE(grepの既定)では \( \) のようにバックスラッシュを付けて初めてグループの意味になる。
つまり同じ「abcを1回以上」でも、書き方が変わる。ERE(grep -E)なら (abc)+、BRE(grep)なら \(abc\)\+ だ。かっこ自体の要不要が逆転する点がまぎらわしいので、最初は声に出して確認するとよい。
🧩 かっこは「取り出しラベル」にもなる
グループ化にはもう1つ大事な役割がある。かっこで囲んだ部分は、マッチした実際の文字列を後から呼び出せる「番号付きの入れ物」にもなるということだ。
見た目は同じ丸かっこでも、役割が2つあると知っておくと理解が早い。1つは今見た「量指定子をまとめて効かせる」役割、もう1つがこれから見る「マッチした中身を覚えて後で使う」役割だ。
1つ目のかっこの中身は \1、2つ目は \2、というように左から出てくる順に番号が振られる。この番号を使って同じ内容をもう一度参照する仕組みを「後方参照」と呼ぶ。
たとえば grep -E '(\w+) \1' は「同じ単語が空白をはさんで2回続く行」にマッチする。\1 のところに \w+ が実際に拾った文字列(例えば the)がそのまま入るイメージだ。
この仕組みが特に輝くのが sed の置換だ。探す側でかっこを使って一部を覚えておき、置き換える側で \1 として呼び出せば、一致した部分を活かしたまま形だけを変えられる。
💴 sedで「探した数字だけ活かす」置換
具体例として、1500円 のような文字列を 1500 JPY の形に書き換えたいとする。数字部分は毎回違うので、固定の置換では対応できない。
以前の回で見た sed の置換は s/古い/新しい/ のように、決まった文字列を決まった文字列に変える使い方が中心だった。しかし今回は「数字だけそのまま残して、単位の表記だけ変える」という一段複雑な要求になる。
ここでグループ化と後方参照が役立つ。数字の並びを \( \) で囲んで覚えさせ、置き換える側でその番号を呼び出せばよい。
この式を分解すると、探す側の \(.*\) が「円の手前までの何文字か」をまるごとグループ1として覚え、円 という文字自体は使い捨てで消える。置き換える側の \1 JPY が、覚えた中身をそのまま書き戻したうえで単位だけ JPY に差し替える。
同じ考え方は他の場面にも応用できる。日付の 2026/07/03 を 2026-07-03 に変えたり、ログの [ERROR] タグだけ残して前後を整形したりと、パターンの一部を保ったまま形だけ整える処理は、後方参照を知っているかどうかで書けるコマンドの幅が大きく変わってくる。
🔀 交替 | と組み合わせて選択肢をまとめる
グループ化は交替(|、「または」の意味)と組み合わせると威力を増す。かっこの中に | を置けば、その範囲だけで選択肢を切り替えられる。
かっこがなければ cat|dogs は「cat」または「dogs」という別々の候補になってしまうが、(cat|dog)s? なら「catかdogのどちらかに、任意でsが続く」という1つのまとまりとして扱える。かっこが | の効く範囲を区切っているわけだ。BREでは | 自体も \| と書かないと「または」の意味にならないので、grepで交替を使いたいときは -E を付けて拡張正規表現モードにするのが素直な道だ。
🔧 番号がずれる落とし穴に注意
かっこが複数あるときは、開きかっこが出てくる順番で \1 \2 \3 … と番号が振られる。ネストしていても同じルールで、外側のかっこが先に開けば先に番号を持つ。
sedやgrepでかっこの数と \番号 の数が合わないとエラーになったり意図しない挙動になったりするので、書いたら一度サンプルの文字列で試し打ちする癖をつけておくと安心だ。
次への橋渡し
グループ化と後方参照を覚えると、正規表現は「探すだけ」の道具から「探した形を活かして書き換える」道具に変わる。特にsedでの機械的な一括置換は、この仕組みなしでは成立しない場面が多い。
最初は \( \) と \1 の対応を目で追うのに時間がかかるかもしれないが、パターンは決まっている。探す側でかっこを開いた順に番号が付き、置き換える側では欲しいところにその番号を置くだけだ。焦らず小さな例で試していけば自然と手になじむ。
ここまでの知識を組み合わせれば、ログの日付形式の入れ替えや、設定ファイルの値だけを差し替えるといった実務の定番作業にも手が届く。次はこの土台の上に、さらに実践的な加工パターンを積み上げていこう。