sedを使用して最初の一致グループの後に数字を使用して検索と置換を実行する方法(一致グループの適切なエスケープ)

sedを使用して最初の一致グループの後に数字を使用して検索と置換を実行する方法(一致グループの適切なエスケープ)

ヘッダー

たぶんこれを変換したいかもしれません:

aaaa

到着する:

1aaa1

したがって、次のように提案してみましょう。

echo aaaa | sed --regexp-extended 's/(.*)a/1\11/'
1aaa1

質問

1\11100%有効で明確なパターンですかsedsedこのタイプの置換のすべてのベストプラクティスに従いましたか?

私の言葉は1\11 おそらくおそらく両方があります:

  1. charに置き換えて1から1°一致グループ、次に別のcharに置き換えます1(→現在の動作)
  2. 文字に変更した111° 一致グループ(→例外発生)

現在私のsedバージョンに最初の説明があるようです。とにかく、これが文書化されているのか、それとも.NETで可能なのかわかりませんsed

説明していただきありがとうございます。同時に、私はこれの上に城を建てません。

現在私はGNU sed 4.7を使用しています。

答え1

@QuartzCristalユーザーが言ったように、GNUのマニュアルページsedには次のメモがあります。

s/正規表現/交換/

パターン空間と正規表現を一致させてください。成功すると、交換と一致する部分が交換されます。代替項目には、パターン空間の一致する部分を表す特殊文字&、正規表現で一致する対応するサブ式を表す特殊エスケープ文字\ 1〜\ 9を含めることができます。

1Perlのような一般的なプログラミング言語から来たので、そのような制限がないことを知りませんでした9(例えば、私が書くことができるからです1{$19}1sed。したがって、構文は現在100%正確で異なる方法で解釈できないことがわかります。

この答えはGNU sedで動作します。 POSIX定義かどうかはわかりません。

答え2

一つあるPOSIXの説明内容は次のとおりです。

逆参照式 '\n' は、 '\n' の前の '(' と ')' の間のサブ式と同じ (空であってもよい) 文字列と一致する必要があります。文字「n」は、n番目のサブ式(パターンの先頭からn番目の「(」で始まり対応する「)」のペアで終わるサブ式)を指定する1から9の間の数字でなければなりません。

そうすれば\10または\11

これはBREの構文ですが、POSIXのEREは逆参照を許可しないため、心配する必要はありません。

GNU sed マニュアルにも同じ内容が記載されています。私はどんなsedも逆参照よりも多くの機能を許可するとは思いません\1...\9

さらに、代替項目の右側には、s///キャプチャ角かっこへの参照を含めることができます。人々はPosixには明確な区別はありません。:

「\n」文字 (ここで n は数字) は、対応する逆参照式と一致するテキストで置き換える必要があります。

しかし、逆参照と同じ規則を使用しているようです。

GNU sed は次のように明示的に指定します。

逆参照は、バックスラッシュと単一の数字(たとえば「\ 1」)で指定されます。

Perlは、より多くの逆参照を可能にする言語です。ただし、この言語では2桁以上の逆参照が作成されます${23}。私はそのような条項または同様の条項が一般的に混乱を避けるためであると思います。

関連情報