Saya telah berhasil menggunakan sed
perintah berikut untuk mencari / mengganti teks di Linux:
sed -i 's/old_link/new_link/g' *
Namun, ketika saya mencobanya di Mac OS X, saya mendapatkan:
"perintah c mengharapkan \ diikuti oleh teks"
Saya pikir Mac saya menjalankan shell BASH normal. Ada apa?
EDIT:
Menurut @ High Performance, ini karena Mac sed
memiliki rasa (BSD) yang berbeda, jadi pertanyaan saya adalah bagaimana cara mereplikasi perintah ini di BSD sed
?
EDIT:
Berikut adalah contoh aktual yang menyebabkan ini:
sed -i 's/hello/gbye/g' *
sed
melihat "c" di data Anda sebagai perintah. Apakah Anda menggunakan variabel? Silakan posting sesuatu yang lebih dekat mewakili perintah aktual dan beberapa data yang sedang Anda proses. Anda bisa mendapatkan demonstrasi sederhana dari kesalahan ini dengan melakukanecho x | sed c
.Jawaban:
Jika Anda menggunakan
-i
opsi ini, Anda perlu memberikan ekstensi untuk cadangan Anda.Jika Anda memiliki:
Perintah (perhatikan kurangnya ruang antara
-i
dan''
dan-e
untuk membuatnya bekerja pada versi baru dari Mac dan GNU):Buat 2 file cadangan seperti:
Tidak ada cara portabel untuk menghindari membuat file cadangan karena tidak mungkin menemukan campuran perintah sed yang bekerja pada semua kasus:
sed -i -e ...
- tidak berfungsi pada OS X karena membuat-e
cadangansed -i'' -e ...
- tidak bekerja pada OS X 10.6 tetapi bekerja pada 10.9+sed -i '' -e ...
- tidak bekerja pada GNUCatatan Mengingat bahwa tidak ada perintah sed yang bekerja pada semua platform, Anda dapat mencoba menggunakan perintah lain untuk mencapai hasil yang sama.
Misalnya,
perl -i -pe's/old_link/new_link/g' *
sumber
sed
bisa Anda ketahui, Anda TIDAK menyediakan akhiran cadangan. Sufiks cadangan adalahs/old_link/new_link/g
. Argumen selanjutnya setelah itu seharusnya adalah perintah pengeditan. Karena itu mengartikan perintah sebagai nama cadangan, ia kemudian mengambil nama file pertama sebagai perintah pengeditan, tetapi mereka tidak valid.sed -i '' -e ...
?sed -i'' -e
tampaknya tidak berfungsi seperti yang diharapkan pada mac 10.14Saya percaya pada OS X ketika Anda menggunakan -i ekstensi untuk file cadangan diperlukan . Mencoba:
Menggunakan GNU
sed
, ekstensi bersifat opsional .sumber
Ini berfungsi dengan versi sed GNU dan BSD:
atau dengan cadangan:
Catat ruang yang hilang setelah
-i
opsi! (Diperlukan untuk GNU sed)sumber
rm
perintah setelah itu untuk menghapusnya.sed -i'' ...
=>sed -i '' ...
Punya masalah yang sama di Mac dan menyelesaikannya dengan
brew
:dan gunakan sebagai
Anda dapat mengatur juga mengatur
sed
sebagai alias untukgsed
(jika Anda mau):sumber
Atau, Anda dapat menginstal versi sed GNU di Mac Anda, yang disebut gsed, dan menggunakannya menggunakan sintaks Linux standar.
Untuk itu, instal
gsed
menggunakan port (jika Anda tidak memilikinya, dapatkan di http://www.macports.org/ ) dengan menjalankansudo port install gsed
. Lalu, Anda bisa berlarised -i 's/old_link/new_link/g' *
sumber
gnu-sed
Mac Anda memang menjalankan BASH shell, tetapi ini lebih merupakan pertanyaan implementasi sed yang Anda hadapi. Pada Mac, sed berasal dari BSD dan sedikit berbeda dari sed yang Anda temukan pada kotak Linux yang khas. Saya sarankan kamu
man sed
.sumber
Jawaban Sinetris benar, tetapi saya menggunakan ini dengan
find
perintah untuk lebih spesifik tentang file apa yang ingin saya ubah. Secara umum ini harus bekerja (diuji pada OSX/bin/bash
):Secara umum ketika menggunakan
sed
tanpafind
dalam proyek yang kompleks kurang efisien.sumber
-exec
sangat baik! Saya hanya ingin tahu apakah tebasan pada akhirnya benar-benar dibutuhkan\
,;
ditafsirkan oleh shell ketika saya mencoba seperti ituSaya telah membuat fungsi untuk menangani
sed
perbedaan antara MacOS (diuji pada MacOS 10.12) dan OS lainnya:Pemakaian:
Dimana:
,
adalah delimeter's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','
adalah pola"./mysql/.env"
adalah path ke filesumber
Inilah cara menerapkan variabel lingkungan ke file templat (tidak perlu cadangan).
1. Buat template dengan {{FOO}} untuk diganti nanti.
2. Ganti {{FOO}} dengan variabel FOO dan hasilkan ke file foo.conf baru
Bekerja baik macOS 10.12.4 dan Ubuntu 14.04.5
sumber
Seperti yang ditunjukkan oleh jawaban lain, tidak ada cara untuk menggunakan portable di OS X dan Linux tanpa membuat file cadangan. Jadi, saya malah menggunakan Ruby satu-liner ini untuk melakukannya:
Dalam kasus saya, saya perlu menyebutnya dari
rake
tugas (yaitu, di dalam skrip Ruby), jadi saya menggunakan tingkat kutipan tambahan:sumber
Bekerja pada BSD & Linux
sumber
e
menambahkan