🐧 Linux 総合学習プラットフォーム
正規表現・テキスト処理 ・ 中級

グループ化と後方参照

正規表現には、複数の文字をひとまとめにして扱う「グループ化」という機能があります。かっこでくくった部分は量指定子をまとめて効かせられるだけでなく、後から \1 \2 という番号で呼び出せる「後方参照」の対象にもなります。特にsedの置換では、探した部分の一部をそのまま新しい形に組み込めるので、機械的な書き換えがぐっと楽になります。BREとEREでかっこの書き方が違う点も、ここで一緒に整理します。

ここまでの量指定子は「直前の1文字」にしか効かなかった。abc* なら * が効くのは c だけで、abc全体を繰り返す指定はできない。

実務ではこの壁に何度もぶつかる。ログイン失敗のログで user1user1 のように同じ語が連続する行だけ拾いたい、あるいは 1500円 という金額表記をまとめて 1500 JPY に直したい、といった場面では「1文字だけ」の指定では手が届かない。

この壁を越えるのが「グループ化」だ。かっこで複数文字をひとまとめにすると、そのかたまり全体に量指定子をかけられるようになる。

🔗
たとえグループ化は洗濯物をネットに入れる作業に似ている。バラの靴下1枚(直前の1文字)しかまとめられなかったのが、ネット(かっこ)を使えば何枚分もまとめて1つの単位として扱える。

拡張正規表現(ERE)では (abc)+ と書けば abc というかたまりが1回以上繰り返すパターンになる。abcabcabc にも abc 単体にもマッチする。

ここで思い出したいのが以前の回で見たBREとEREの違いだ。EREでは ( ) がそのまま特殊文字として働くが、BRE(grepの既定)では \( \) のようにバックスラッシュを付けて初めてグループの意味になる。

つまり同じ「abcを1回以上」でも、書き方が変わる。ERE(grep -E)なら (abc)+、BRE(grep)なら \(abc\)\+ だ。かっこ自体の要不要が逆転する点がまぎらわしいので、最初は声に出して確認するとよい。

$ grep -E '(ab)+' sample.txt ababab を含む行にマッチ
BRE(grep)\(ab\)\+ERE(grep -E)(ab)+かっこに \ が要るかっこはそのまま意味は同じ「ab を1回以上」

🧩 かっこは「取り出しラベル」にもなる

グループ化にはもう1つ大事な役割がある。かっこで囲んだ部分は、マッチした実際の文字列を後から呼び出せる「番号付きの入れ物」にもなるということだ。

見た目は同じ丸かっこでも、役割が2つあると知っておくと理解が早い。1つは今見た「量指定子をまとめて効かせる」役割、もう1つがこれから見る「マッチした中身を覚えて後で使う」役割だ。

1つ目のかっこの中身は \1、2つ目は \2、というように左から出てくる順に番号が振られる。この番号を使って同じ内容をもう一度参照する仕組みを「後方参照」と呼ぶ。

💡
ポイント後方参照は「パターンの中でマッチした文字列そのもの」を指す。固定の文字列ではなく、実行するたびに中身が変わる点がポイントだ。
🔗
たとえ後方参照は伝票の控えのようなものだ。かっこで囲んだ部分を1枚の控え(\1)として手元に残しておき、後の工程で「さっきの控えと同じものをここにも書いて」と使い回せる。

たとえば grep -E '(\w+) \1' は「同じ単語が空白をはさんで2回続く行」にマッチする。\1 のところに \w+ が実際に拾った文字列(例えば the)がそのまま入るイメージだ。

(\w+)空白\1同じ文字列を指すマッチする例the theグループ1で覚えた単語がもう一度そのまま現れたら一致
$ grep -E '(\w+) \1' words.txt the the book のように単語が重複した行だけ拾える
つまずき後方参照は「かっこの中の正規表現パターン」そのものをコピーするのではない。あくまで「その回のマッチで実際に一致した文字列」を再利用する点を混同しないようにしたい。

この仕組みが特に輝くのが sed の置換だ。探す側でかっこを使って一部を覚えておき、置き換える側で \1 として呼び出せば、一致した部分を活かしたまま形だけを変えられる。

💴 sedで「探した数字だけ活かす」置換

具体例として、1500円 のような文字列を 1500 JPY の形に書き換えたいとする。数字部分は毎回違うので、固定の置換では対応できない。

以前の回で見た sed の置換は s/古い/新しい/ のように、決まった文字列を決まった文字列に変える使い方が中心だった。しかし今回は「数字だけそのまま残して、単位の表記だけ変える」という一段複雑な要求になる。

ここでグループ化と後方参照が役立つ。数字の並びを \( \) で囲んで覚えさせ、置き換える側でその番号を呼び出せばよい。

$ echo '1500円' | sed 's/\(.*\)円/\1 JPY/' 1500 JPY

この式を分解すると、探す側の \(.*\) が「円の手前までの何文字か」をまるごとグループ1として覚え、円 という文字自体は使い捨てで消える。置き換える側の \1 JPY が、覚えた中身をそのまま書き戻したうえで単位だけ JPY に差し替える。

同じ考え方は他の場面にも応用できる。日付の 2026/07/03 を 2026-07-03 に変えたり、ログの [ERROR] タグだけ残して前後を整形したりと、パターンの一部を保ったまま形だけ整える処理は、後方参照を知っているかどうかで書けるコマンドの幅が大きく変わってくる。

入力1500円探す側s/\(.*\)円/グループ1 = 1500円 は覚えず捨てる\1 JPY/出力1500 JPY\1 が呼び戻す
コツsed は既定でBREの方言を使うため、グループ化には \( \) を使う。-E オプションを付けて拡張正規表現モードにすれば ( ) をそのまま書けるようになり、\(.*\)円 は (.*)円 と書ける。

🔀 交替 | と組み合わせて選択肢をまとめる

グループ化は交替(|、「または」の意味)と組み合わせると威力を増す。かっこの中に | を置けば、その範囲だけで選択肢を切り替えられる。

$ grep -E '(cat|dog)s?' pets.txt cat cats dog dogs のどれにもマッチ

かっこがなければ cat|dogs は「cat」または「dogs」という別々の候補になってしまうが、(cat|dog)s? なら「catかdogのどちらかに、任意でsが続く」という1つのまとまりとして扱える。かっこが | の効く範囲を区切っているわけだ。BREでは | 自体も \| と書かないと「または」の意味にならないので、grepで交替を使いたいときは -E を付けて拡張正規表現モードにするのが素直な道だ。

🔧 番号がずれる落とし穴に注意

かっこが複数あるときは、開きかっこが出てくる順番で \1 \2 \3 … と番号が振られる。ネストしていても同じルールで、外側のかっこが先に開けば先に番号を持つ。

コツ置換式が長くなって \1 \2 の対応が分かりにくくなったら、いったんかっこを1つずつ足しながら小さいサンプルで試すと、どの番号がどこを指すか確認しやすい。

sedやgrepでかっこの数と \番号 の数が合わないとエラーになったり意図しない挙動になったりするので、書いたら一度サンプルの文字列で試し打ちする癖をつけておくと安心だ。

次への橋渡し

グループ化と後方参照を覚えると、正規表現は「探すだけ」の道具から「探した形を活かして書き換える」道具に変わる。特にsedでの機械的な一括置換は、この仕組みなしでは成立しない場面が多い。

最初は \( \) と \1 の対応を目で追うのに時間がかかるかもしれないが、パターンは決まっている。探す側でかっこを開いた順に番号が付き、置き換える側では欲しいところにその番号を置くだけだ。焦らず小さな例で試していけば自然と手になじむ。

ここまでの知識を組み合わせれば、ログの日付形式の入れ替えや、設定ファイルの値だけを差し替えるといった実務の定番作業にも手が届く。次はこの土台の上に、さらに実践的な加工パターンを積み上げていこう。

この項目に出てくる用語

グループ化ぐるーぷか
かっこで正規表現の一部をひとまとめにし、量指定子をまとめて効かせたり後から取り出したりできるようにすること。
後方参照こうほうさんしょう
かっこでグループ化した部分がマッチした文字列を、\1 \2 のような番号で後から再利用する仕組み。
交替こうたい
| (縦棒)を使って「AまたはB」のように複数の候補のどれか1つにマッチさせる正規表現の書き方。
sedせど
1行ずつ加工するストリームエディタ。置換 s/// が代表的。
基本正規表現(BRE)きほんせいきひょうげん
grep や sed の既定方言。+ ? { } ( ) | に \ が必要。
拡張正規表現(ERE)かくちょうせいきひょうげん
grep -E などで使う方言。+ ? { } ( ) | をそのまま書ける。

関連コマンド

sedgrep

▶ 学習アプリでこの続きを学ぶ・演習する