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


103

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

コマンドのバリアントの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、char 59: `s 'コマンドのRHSの参照\ 1が無効です


10
私の場合、私は-i(編集オプション)とを組み合わせており-re、その結果-ire(フラグメントを引数として-i消費していたため、拡張正規表現モードが有効になっていませんでした)。それを変更して問題を修正しました。reSUFFIX-i -re
Janaka Bandara 2017年

特にを解釈する場合、一'重引用符と二重引用符の"扱いが少し異なることに注意して$varsください。例:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"機能しますが、sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'機能しません。
not2qubit 2018年

回答:


51

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

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

(注:未テスト)

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


42
-rsedへのオプションは、後方参照が機能するために必要であると思われます。たとえば、sed -e 's/([[:digit:]])/is a digit/'動作しsed -e 's/([[:digit:]])/\1 is a digit/ますが-r、sed せずに元のエラーを生成します。 注: sedの最初の呼び出しはリテラル(<digit>)を検索し、キャプチャグループではありません
Andrew Falanga

回答の下のコメントは実際には回答です。回答を編集して反映することもできます。
miroxlav 2017

@AndrewFalangaあなたはコメントを回答として投稿するべきでした
sanmai

2
私の間違いは使用の-ire代わりに使用すること-riでした。注文の問題:-)
m3nda

54

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


例えば:

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

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

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

6
注意、使用する-r場合、括弧をエスケープする必要はありません。
qräbnö

13

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


5

あなたは脱出する必要が/後を.

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"

合理的に聞こえます。ただし、スクリプトのコンテキストでは機能しません。
JJD 2013年

ごめんなさい。編集によりエラーが発生します:sed: -e expression #7, char 58: Invalid range end。@Denisの回答が機能します。
JJD 2013年

2
では、@ Denisの回答に+1を付けます
slackmart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.