Uruchamiam kilka poleceń zastępowania jako rdzeń skryptu kolorowania dla maven . Jedno z sed
poleceń używa wyrażenia regularnego, które działa w powłoce, jak omówiono tutaj . Aktualną (nie działającą) implementację można znaleźć tutaj .
Kiedy dołączam jeden z wariantów polecenia do skryptu, zachodzi się inaczej:
Wariant 1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Dostosowane do scenariusza:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Błąd: Powłoka wyświetla te same informacje, co gdybym wpisał $ sed
. Dziwne!?
Wariant 2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Dostosowane do scenariusza:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Błąd:
sed: -e wyrażenie # 7, char 59: niepoprawne odniesienie \ 1 do prawej strony polecenia `s '
regex
sed
substitution
JJD
źródło
źródło
-i
opcję (edit in place) z-re
, co spowodowało-ire
(tak, że-i
zużywałre
fragment jako jegoSUFFIX
argument, a zatem rozszerzony tryb regex nie był włączony); zmieniając go, aby-i -re
rozwiązać problem.'
i podwójne cudzysłowy"
są traktowane nieco inaczej, szczególnie podczas interpretacji$vars
. Na przykład:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"
działa, ale:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'
nie.Odpowiedzi:
Czy nie musisz faktycznie rejestrować, aby to zadziałało? tj. dla wariantu 2:
(Uwaga: nieprzetestowane)
Bez argumentu -r odniesienia wsteczne (takie jak \ 1) nie będą działać.
źródło
-r
Opcja pojawi sed być konieczne do tylnej odniesieniu do pracy. Np.sed -e 's/([[:digit:]])/is a digit/'
Działa, alesed -e 's/([[:digit:]])/\1 is a digit/
generuje oryginalny błąd bez-r
seda. UWAGA: pierwsze wywołanie sed wyszukuje literał(<digit>)
i nie jest grupą przechwytywania.-ire
zamiast używania-ri
. Porządek ma znaczenie :-)Ten błąd występuje często w przypadku nawiasów bez zmiany znaczenia. Ucieknij im i spróbuj ponownie.
Na przykład:
Przed każdym nawiasem należy używać odwrotnych ukośników:
źródło
-r
, nie musisz uciekać przed nawiasami.Jeśli opcja
-r
/--regexp-extended
nie jest podana, należy wprowadzić zmiany w nawiasach przechwytujących.źródło
Musisz uciec
/
po.
Lub jeśli nie chcesz się martwić o ucieczkę, użyj
|
EDYTOWAĆ:
źródło
sed: -e expression #7, char 58: Invalid range end
. Odpowiedź @Denisa działa.