mavenの色付けスクリプト の中核として、いくつかの置換コマンドを実行します。 sed
コマンドの1つは、シェルで ここで説明します のように機能する正規表現を使用します。現在の(動作していない)実装は here にあります。
コマンドのバリアントの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 expression#7、char 59: `s 'コマンドのRHSの無効な参照\ 1
実際にキャプチャする必要はありませんか?つまり、バリアント2の場合:
-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \
(注:未テスト)
-r引数がないと、後方参照(\ 1など)は機能しません。
このエラーは、エスケープされていない括弧によく見られます。それらをエスケープして再試行してください。
例えば:
/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g
各括弧の前にバックスラッシュでエスケープする必要があります。
/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g
/
の後に.
をエスケープする必要があります
sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"
または、エスケープについて心配したくない場合は、|
を使用します
sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"
編集:
sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"
-r
/--regexp-extended
オプションが指定されていない場合、キャプチャ括弧をエスケープする必要があります。