5.7 後方参照と部分式

後方参照は、一致した正規表現の前の部分を参照する正規表現の命令です。バックスラッシュと1桁の数字で指定します(例:「\1」)。参照される正規表現の部分を部分式と呼び、丸括弧で指定します。

後方参照と部分式には2つの用途があります。正規表現の検索パターンと、sコマンドのreplacement部分です(正規表現アドレスとsコマンドを参照)。

正規表現パターンの後方参照は、先に一致した部分式と同じ内容に一致させるために使います。次の例の部分式は「.」、つまり任意の1文字です(丸括弧で囲むことで部分式になります)。後方参照「\1」は、部分式と同じ内容(同じ文字)への一致を指定します。

次のコマンドは、任意の文字で始まり、その後に文字「o」、さらに最初と同じ文字が続く単語に一致します。

$ sed -E -n '/^(.)o\1$/p' /usr/share/dict/words
bob
mom
non
pop
sos
tot
wow

複数の部分式には左から右へ自動的に番号が付きます。このコマンドは6文字の回文を探します(最初の3文字が3つの部分式で、その後に逆順の3つの後方参照が続きます)。

$ sed -E -n '/^(.)(.)(.)\3\2\1$/p' /usr/share/dict/words
redder

sコマンドでは、replacement部分の後方参照を使ってregexp部分の部分式を参照できます。

次の例は、正規表現内の2つの部分式で、空白で区切られた2つの単語に一致します。replacement部分の後方参照により、単語を別の順序で表示します。

$ echo "James Bond" | sed -E 's/(.*) (.*)/The name is \2, \1 \2./'
The name is Bond, James Bond.

選択と組み合わせて使う場合、そのグループが一致に参加しなければ、後方参照によって一致全体が失敗します。たとえば、「a(.)|b\1」は「ba」に一致しません。-eやファイル(「-f file」)で複数の正規表現を指定した場合、後方参照は各式の内部に限定されます。