Apa tujuan dari -e dalam perintah sed?

41

Saya tidak dapat menemukan dokumentasi tentang sed -esakelar, untuk penggantian sederhana, apakah saya memerlukannya?

misalnya

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'
Howard
sumber
14
Apakah Anda yakin tidak menemukannya man sed?
4
Anda tidak menemukan penjelasan potong, mengapa tidak menggunakan "cmd1; cmd2"
pengguna tidak diketahui

Jawaban:

28

Dari halaman manual:

-e script, --expression=script

    add the script to the commands to be executed

Jadi, Anda dapat menggunakan beberapa -eopsi untuk membuat skrip dari banyak bagian.

$ sed -e "s/foo/bar/" -e "/FOO/d"

Pertama akan mengganti foodengan bardan kemudian menghapus setiap baris yang berisi FOO.


sumber
3
Jadi, Anda tidak perlu '-e' jika Anda hanya memiliki satu skrip, bukan?
JohnyTex
Saya juga sedang mencari tujuan sebenarnya dari-e
typelogic
27

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/ddan dikelompokkan berdasarkan {...} eg /foo/{h;d}tetapi untuk i,a,cperintah tersebut -ememberikan 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
lcd047
sumber
1
Pada setidaknya beberapa implementasi sed (misalnya, pada FreeBSD), Anda juga perlu mengakhiri label dan perintah cabang menggunakan baris baru / -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"
dubiousjim
Saya tidak yakin seberapa penting arti must be terminated with a newlinefrasa 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?
typelogic
1

-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.

flow2k
sumber
0

Dalam bantuan untuk sedAnda akan menemukan bahwa -ebendera 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 -edigunakan. Alasan untuk itu adalah -ememungkinkan 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 sedmenafsirkan yang pertama s/foo/barsebagai nama file. Karenanya, untuk membuat hidup Anda lebih mudah di masa depan, Anda sudah dapat mulai menggunakan -ebendera 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

BakaKuna
sumber