web-dev-qa-db-ja.com

sedエラー:「 `s 'コマンドのRHSの無効な参照\ 1」

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

77
JJD

実際にキャプチャする必要はありませんか?つまり、バリアント2の場合:

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

(注:未テスト)

-r引数がないと、後方参照(\ 1など)は機能しません。

37

このエラーは、エスケープされていない括弧によく見られます。それらをエスケープして再試行してください。


例えば:

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

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

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

/の後に.をエスケープする必要があります

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"
4
slackmart

-r/--regexp-extendedオプションが指定されていない場合、キャプチャ括弧をエスケープする必要があります。

1
OrangeDog