REに\ 1が定義されていませんか?

REに\ 1が定義されていませんか?

私のコードは次のとおりです

cat file.ign | sed 's/^([^A-Za-z0-9]+ )/<ignore>\1<\/ignore>/g'

しかし、エラーメッセージが表示されます。

sed: 1: "s/^([^A-Za-z0-9]+ )/<ig ...": \1 not defined in the RE

答え1

括弧は、基本正規表現(BRE)構文のリテラルです。キャプチャグループを表すには、次のようにエスケープする必要があります\(\)

また、@BenjaminWのコメントで指摘したように、+BREでは文字通りです。 GNU sed は\+BRE で数量子としてサポートされます。

sed 's/^\([^A-Za-z0-9]\+ \)/<ignore>\1<\/ignore>/g'

(しかし他の実装ではそうではないかもしれません)。または、適切にまたはコマンドラインスイッチを使用して拡張正規表現(ERE)モードをオンにします-E(該当するバージョンのマニュアルを確認してください)。-r

sed -E 's/^([^A-Za-z0-9]+ )/<ignore>\1<\/ignore>/g'

または、POSIX準拠の数量子を使用してください。\{1,\}

sed 's/^\([^A-Za-z0-9]\{1,\} \)/<ignore>\1<\/ignore>/g'

ASIDE(グローバル置換)修飾子は、式がパターンの先頭に固定されているため、ここではg何の効果もありません(1行に1回しか発生しません)。^

答え2

使用GNU sed、asを呼び出すか、sed -Eかっこをエスケープして逆参照が機能するようにすることができますが、GNU sedを使用しない場合は逆参照に依存することはできません。POSIX sedいいえ(しかし、)は拡張正規表現(ERE)-Eまたはパラメータをサポートせず、-rGNUのデフォルト正規表現(BRE)バックスラッシュ表記もサポートしません。 (ここにいるPOSIX EREとBREの詳細、GNUのBRE実装、EREへのエスケープを可能にする機能について深く議論しません。 )

幸いなことに(この場合)EREは必要ありません。これはあなたに役立ちます:

sed 's/^[^A-Za-z0-9][^A-Za-z0-9]* /<ignore>&<\/ignore>/' file.ign

BREは数量子をサポートしていないため、+「1」を要求してから「0以上」を要求して、非単語文字セットを2倍にして「1以上」にする必要があります。アンパサンド(&)は完全一致を表します。この場合、すべてを結ぶ必要はありません。 (行開始アンカーの^幅は0なので、ここでは重要ではありません。)

cat不要で削除しました。また、アンカーは1行に1回しか一致できないため、/g修飾子を削除しました。したがって、2 番目の一致が得られないため、グローバル置換は何も行いません。^

関連情報