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」)で複数の正規表現を指定した場合、後方参照は各式の内部に限定されます。