127

maven の colorize スクリプトの中核として、いくつかの置換コマンドを実行します。コマンドの 1 つは、こちらで説明されsedているように、シェル内で機能する正規表現を使用します。現在の (動作していない) 実装は、ここにあります。

コマンドのバリアントの 1 つをスクリプトに含めると、異なる動作が発生します。

バリエーション 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

スクリプトに適応:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

エラー:シェルは、入力した場合と同じ情報を出力します$ sed。変!?


バリアント 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

スクリプトに適応:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

エラー:

sed: -e 式 #7、文字 59: `s' コマンドの RHS の参照 \1 が無効です

4

4 に答える 4

84

それが機能するために実際にキャプチャする必要はありませんか?つまり、バリアント #2 の場合:

-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(注: 未テスト)

-r引数がないと、各括弧が文字でエスケープされない限り、後方参照 ( など)\1は機能しません\

では、括弧がエスケープされていない限り-r、引数の後方参照 ( など) は機能しません。\1

于 2013-05-19T18:10:07.717 に答える
58

このエラーは、エスケープされていない括弧でよく発生します。それらをエスケープして、もう一度やり直してください。


例えば:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

各括弧の前にバックスラッシュでエスケープする必要があります:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g
于 2016-01-18T22:34:55.197 に答える