sed hatası: "s 'komutunun RHS'sinde geçersiz referans \ 1"


104

Maven için bir renklendirme komut dosyasının çekirdeği olarak birkaç değiştirme komutu çalıştırıyorum . sedKomutlardan biri, burada tartışıldığı gibi kabukta bulmaya çalışan normal bir ifade kullanır . Mevcut (çalışmayan) uygulama burada bulunabilir .

Komutun varyantlarından birini betiğe dahil ettiğimde farklı davranışlar ortaya çıkıyor:

Varyant 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

Senaryoya uyarlandı:

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

Hata: Kabuk, yazacakmışım gibi aynı bilgileri veriyor $ sed. Garip!?


Varyant 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

Senaryoya uyarlandı:

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

Hata:

sed: -e ifade # 7, karakter 59: "s 'komutunun RHS'sinde geçersiz referans \ 1


10
Benim durumumda bir -i(yerinde düzenle seçeneğini) ile birleştirmiştim -re, -ire(böylelikle parçayı bağımsız değişken olarak -itüketiyordum ve dolayısıyla genişletilmiş normal ifade modu etkinleştirilmiyordu); sorunu düzeltmek için değiştirerek . reSUFFIX-i -re
Janaka Bandara

Ayrıca, tek tırnakların 've çift tırnakların "özellikle yorumlanırken biraz farklı ele alındığına dikkat etmek gerekir $vars. Örneğin: sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"çalışır, ancak: sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'çalışmaz.
not2qubit

Yanıtlar:


53

Bunun işe yaraması için gerçekten yakalamaya gerek yok mu? ör. varyant 2 için:

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

(Not: test edilmemiş)

-R bağımsız değişkeni olmadan geri referanslar (\ 1 gibi) çalışmaz.


42
-rSed göründüğünü seçenek işe geri-başvuru için gerekli olduğuna. Örneğin sed -e 's/([[:digit:]])/is a digit/'çalışır, ancak sed sed -e 's/([[:digit:]])/\1 is a digit/olmadan orijinal hatayı üretir -r. NOT: sed'in ilk çağrısı hazır bilgi için arar (<digit>)ve bir yakalama grubu değildir .
Andrew Falanga

Cevabın altındaki yorum aslında bir cevaptır. Belki cevabınızı yansıtacak şekilde düzenleyebilirsiniz.
miroxlav

@AndrewFalanga yorumunuzu cevap olarak
göndermiş olmalısınız

2
Benim hatamın kullanmak -ireyerine kullanmak olduğunu boşver -ri. Sipariş önemlidir :-)
m3nda

55

Bu hata, öncelenmeyen parantezler için yaygındır. Onlardan kaç ve tekrar dene.


Örneğin:

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

Her parantezden önce ters eğik çizgi ile önlenmelidir:

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

6
Dikkat, eğer kullanırsanız -rparantezlerden kaçmanız gerekmez.
qräbnö

13

Eğer -r/ --regexp-extendedseçeneği sağlanmaz, daha sonra yakalama parantez şekilde çıkmalıdır.


5

Kaçmak gerek /sonra.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

Veya kaçma konusunda endişelenmek istemiyorsanız, |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

DÜZENLE:

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

Kulağa makul geliyor. Ancak senaryo bağlamında çalışmıyor.
JJD

Afedersiniz. Düzenlemek hata yükseltir: sed: -e expression #7, char 58: Invalid range end. @Denis'in cevabı işe yarıyor.
JJD

2
Tamam, sonra @Denis'in cevabı için +1
slackmart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.