kode perintah tidak valid., meskipun lolos dari periode, menggunakan sed

187

Dipaksa menggunakan CVS untuk klien saat ini dan alamat diubah untuk repo jarak jauh. Satu-satunya cara saya dapat menemukan untuk mengubah alamat jarak jauh dalam kode lokal saya adalah pencarian dan penggantian rekursif.

Namun, dengan perintah sed saya berharap untuk bekerja:

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

Saya mendapatkan kesalahan untuk setiap file:

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

Saya sudah mencoba untuk melarikan diri dari periode dalam pertandingan sed / penggantian tetapi itu tidak menyelesaikan apa pun.

helion3
sumber

Jawaban:

476

Jika Anda menggunakan OS X, ini mungkin tidak ada hubungannya dengan perintah sed. Pada versi OSX sed, -iopsi mengharapkan extensionargumen sehingga perintah Anda sebenarnya diuraikan sebagai extensionargumen dan jalur file ditafsirkan sebagai kode perintah.

Coba tambahkan -eargumen secara eksplisit dan berikan ''sebagai argumen ke -i:

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

Lihat ini .

damienfrancois
sumber
41
Jika Anda menghabiskan 10 menit seperti yang saya temukan perbedaannya, itu adalah opsi -e
acheron55
9
Pertanyaan ini menjawab RE error: illegal byte sequencepada MacOS.
JonasVautherin pada
11
saya menggunakan string kosong '' sebagai parameter untuk -i dan itu bekerja, sepertised -i '' 's/blah/xx/g'
Pierre Houston
25
Bagi saya, menambahkan -esetelah -imembuat sedcadangan semua file saya dengan cara ini: "foo.txt" -> "foo.txt-e". Jelas yang saya inginkan sebenarnya -i '', yaitu jangan membuat cadangan file yang diubah.
mdup
3
Masalah yang sama bagi saya. Ini -i -edikombinasikan dengan findmenghasilkan banyak file yang berakhiran -e-e-e-e-e-e-e.
aspyct
39

Anda lupa memberikan argumen kepada -i. Ubah saja -ike -i ''.

Tentu saja itu berarti Anda tidak ingin file Anda dicadangkan; jika tidak, berikan ekstensi pilihan Anda, seperti -i .bak.

mdup
sumber
6

Pada OS X tidak ada yang bisa membantu untuk menjadi memadai. Solusinya adalah:

brew install gnu-sed

Dan kemudian gunakan gsed bukan sed, yang hanya akan berfungsi seperti yang diharapkan.

Dmitry Mikushin
sumber
1
Terima kasih atas jawaban ini, yang sangat bagus untuk saya! Bekerja di Linux dan Mac, saya lebih suka akses ke alat yang akrab daripada belajar perbedaan misterius antara dua yang terkait erat.
Stephen Shank
3

Mungkin domain baru Anda berisi /? Jika demikian, coba gunakan pemisah selain /di sed, mis . #, ,Dll.

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

Akan lebih baik untuk menyertakan s///dalam tanda kutip tunggal daripada tanda kutip ganda untuk menghindari penggantian variabel atau perilaku tak terduga lainnya

jkshah
sumber