私のコードは次のとおりです
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
またはパラメータをサポートせず、-r
GNUのデフォルト正規表現(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 番目の一致が得られないため、グローバル置換は何も行いません。^