Ich führe mehrere Substitutionsbefehle als Kern eines Kolorierungsskripts für Maven aus . Einer der sed
Befehle verwendet einen regulären Ausdruck, der wie hier beschrieben in der Shell gefunden wird . Die aktuelle (nicht funktionierende) Implementierung finden Sie hier .
Wenn ich eine der Varianten des Befehls in das Skript einbinde, tritt ein anderes Verhalten auf:
Variante 1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
An das Skript angepasst:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Fehler: Die Shell gibt die gleichen Informationen aus, als würde ich tippen $ sed
. Seltsam!?
Variante 2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
An das Skript angepasst:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Error:
sed: -e Ausdruck # 7, char 59: ungültige Referenz \ 1 auf der RHS des Befehls 's'
regex
sed
substitution
JJD
quelle
quelle
-i
(Option zum Bearbeiten an Ort und Stelle) mit kombiniert-re
, was dazu führte-ire
(dass-i
dasre
Fragment alsSUFFIX
Argument verwendet wurde und daher der erweiterte Regex-Modus nicht aktiviert wurde). Ändern Sie es, um-i -re
das Problem zu beheben.'
und doppelte Anführungszeichen"
leicht unterschiedlich behandelt werden, insbesondere beim Dolmetschen$vars
. Zum Beispiel:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"
funktioniert, aber:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'
nicht.Antworten:
Müssen Sie nicht tatsächlich erfassen, damit das funktioniert? dh für Variante 2:
(Hinweis: ungetestet)
Ohne das Argument -r funktionieren Rückverweise (wie \ 1) nicht.
quelle
-r
Option zum Sedieren scheint notwendig zu sein, damit der Rückverweis funktioniert. ZBsed -e 's/([[:digit:]])/is a digit/'
funktioniert abersed -e 's/([[:digit:]])/\1 is a digit/
erzeugt den ursprünglichen Fehler ohne-r
zu sedieren. HINWEIS: Der erste Aufruf von sed sucht nach einem Literal(<digit>)
und ist keine Erfassungsgruppe.-ire
statt zu verwenden-ri
.Dieser Fehler tritt häufig bei Klammern auf, die nicht maskiert werden. Entkomme ihnen und versuche es erneut.
Beispielsweise:
Sollte vor jeder Klammer mit Backslashes versehen werden:
quelle
-r
Sie den Klammern nicht entkommen.Wenn die Option
-r
/--regexp-extended
nicht angegeben ist, müssen die Erfassungsklammern maskiert werden.quelle
Sie müssen
/
nach dem entkommen.
Oder wenn Sie sich keine Sorgen um die Flucht machen möchten, verwenden Sie
|
BEARBEITEN:
quelle
sed: -e expression #7, char 58: Invalid range end
. Die Antwort von @Denis funktioniert.