geçersiz komut kodu. kaçan dönemlere rağmen sed kullanarak


187

Geçerli bir istemci için CVS kullanmak zorunda kalmak ve uzak repo için adres değişti. Yerel kodumdaki uzak adresi değiştirmenin tek yolu yinelemeli arama ve değiştirme.

Ancak, sed komutuyla çalışmayı beklerdim:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

Her dosya için bir hata alıyorum:

sed: 1: ".//file/path ...": invalid command code .

Sed maçında / yedekte periyotlardan kaçmaya çalıştım ama bu hiçbir şeyi çözmedi.

Yanıtlar:


476

Bir OS X kullanıyorsanız, bunun muhtemelen sed komutuyla ilgisi yoktur. OSX sürümünde sed, -iseçenek bir extensionbağımsız değişken bekler, böylece komutunuz gerçekteextension bağımsız değişken ve dosya yolu komut kodu olarak yorumlanır.

-eArgümanı açıkça eklemeyi ve aşağıdakilere argüman ''olarak vermeyi deneyin -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

Bkz bu .


41
Farkı bulduğum gibi 10 dakika geçirdiyseniz, -e seçenek
acheron55 15

9
Bu soru MacOS'ta yanıtlıyor RE error: illegal byte sequence.
JonasVautherin

11
boş bir dize '' parametresi olarak kullanılan ve bu gibi çalıştı sed -i '' 's/blah/xx/g'
Pierre Houston

25
Benim için ilave -esonra -iyapılan sedbu yolla yedekleme Tüm dosyalarımı: "fan.txt" -> "fan.txt-e". Açıkçası istediğim şey -i '', yani değiştirilmiş dosyaları yedekleme.
mdup

3
Benim için de aynı sorun. Bu , birçok dosya -i -eile findsonuçlandı -e-e-e-e-e-e-e.
aspyct

39

Sadece bir argüman sunmayı unuttun -i. Sadece değiştirmek -iiçin -i ''.

Tabii ki bu, dosyalarınızın yedeklenmesini istemediğiniz anlamına gelir; aksi takdirde, tercihinizi uzatın -i .bak.


6

OS X'te hiçbir şey kötü yerleşik sed'in yeterli olmasına yardımcı olmaz. Çözüm şudur:

brew install gnu-sed

Ve sonra sadece beklendiği gibi çalışacak sed yerine gsed kullanın.


1
Benim için harika çalışan bu cevap için teşekkür ederim! Hem Linux hem de Mac üzerinde çalışırken, yakından ilişkili iki araç arasındaki gizli farkları öğrenmek yerine tanıdık bir araca erişimi tercih ederim.
Stephen Shank

3

Muhtemelen yeni alan adınız içeriyor /mu? Eğer öyleyse, başka ayırıcı kullanmayı deneyin /içinde sed, örneğin #, ,vb

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

s///Değişken ikameyi veya diğer beklenmedik davranışları önlemek için çift tırnak yerine tek tırnak içine almak da iyi olur.

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.