Saya tidak dapat menemukan dokumentasi tentang sed
-e
sakelar, untuk penggantian sederhana, apakah saya memerlukannya?
misalnya
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Saya tidak dapat menemukan dokumentasi tentang sed
-e
sakelar, untuk penggantian sederhana, apakah saya memerlukannya?
misalnya
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Jawaban:
Dari halaman manual:
-e script, --expression=script
add the script to the commands to be executed
Jadi, Anda dapat menggunakan beberapa -e
opsi untuk membuat skrip dari banyak bagian.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Pertama akan mengganti foo
dengan bar
dan kemudian menghapus setiap baris yang berisi FOO
.
-e
Ini mungkin bekerja untuk Anda:
sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file
Dalam setiap kasus perintah i
(masukkan), a
(tambahkan) dan c
(ubah) perlu diakhiri oleh baris baru.
Biasanya perintah dapat dipisahkan dengan ;
eg /foo/d;/bar/d
dan dikelompokkan berdasarkan {...
} eg /foo/{h;d}
tetapi untuk i,a,c
perintah tersebut -e
memberikan cara untuk memisahkan perintah.
Alternatifnya adalah menggunakan shell (bash) untuk memasukkan baris baru:
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
-e
, bukan dengan titik koma. Ini tidak akan bekerja: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm"
. Tapi ini akan:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newline
frasa di sini. Ketika saya diuji di sini di saya cygwin
, ini bekerja: sed '/foo/i\bar' file
. Jadi sekarang kita dapat menggabungkan ekspresi terpisah menjadi satu, ini menimbulkan lagi pertanyaan awal: Apa tujuan sebenarnya dari -e
?
-e
, setara dengan --expression
, adalah opsional, kecuali jika Anda merangkai beberapa ekspresi bersama (tidak umum) seperti yang ditunjukkan dalam Jawaban lain .
Selain itu: ;
dapat digunakan sebagai gantinya dalam ekspresi yang sama untuk mengeksekusi beberapa ekspresi satu demi satu.
Dalam bantuan untuk sed
Anda akan menemukan bahwa -e
bendera itu singkatan:
-e script, --expression=script
add the script to the commands to be executed
Tetapi Anda bukan yang pertama menjadi bingung setelah bertemu -e
. Dalam contoh Anda sed 's/foo/bar/'
dan sed -e 's/foo/bar/'
setara. Dalam kedua kasus tersebut s/foo/bar/
adalah skrip yang dijalankan oleh sed. Opsi kedua lebih eksplisit, tetapi itu mungkin bukan alasan yang sering Anda lihat -e
digunakan. Alasan untuk itu adalah -e
memungkinkan untuk menggunakan lebih dari satu skrip dengan permintaan yang sama sed
. Itu masih menyisakan pertanyaan mengapa menggunakannya jika Anda hanya menggunakan satu skrip? Contoh berikut mungkin menjelaskan bahwa:
echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
Akan menampilkan "foo".
Namun,
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
akan gagal karena sekarang sed
menafsirkan yang pertama s/foo/bar
sebagai nama file. Karenanya, untuk membuat hidup Anda lebih mudah di masa depan, Anda sudah dapat mulai menggunakan -e
bendera hari ini. Dengan begitu di masa depan Anda bisa menambahkan perintah dengan skrip tambahan dengan menggunakan -e <script>
.
NB Dalam jawaban lain menggunakan ;
sebagai alternatif untuk menggunakan banyak skrip telah disarankan. Walaupun secara teknis mungkin dalam beberapa kasus, itu tidak dianjurkan, karena dengan cepat mengarah ke sangat sulit untuk membaca kode. Lihat contoh di sini: https://www.grymoire.com/Unix/Sed.html#uh-61
man sed
?