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
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.
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
man sed
?Jawaban:
Dari halaman manual:
Jadi, Anda dapat menggunakan beberapa
-e
opsi untuk membuat skrip dari banyak bagian.Pertama akan mengganti
foo
denganbar
dan kemudian menghapus setiap baris yang berisiFOO
.sumber
-e
Ini mungkin bekerja untuk Anda:
Dalam setiap kasus perintah
i
(masukkan),a
(tambahkan) danc
(ubah) perlu diakhiri oleh baris baru.Biasanya perintah dapat dipisahkan dengan
;
eg/foo/d;/bar/d
dan dikelompokkan berdasarkan{...
} eg/foo/{h;d}
tetapi untuki,a,c
perintah tersebut-e
memberikan cara untuk memisahkan perintah.Alternatifnya adalah menggunakan shell (bash) untuk memasukkan baris baru:
sumber
-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 sayacygwin
, 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.sumber
Dalam bantuan untuk
sed
Anda akan menemukan bahwa-e
bendera itu singkatan:Tetapi Anda bukan yang pertama menjadi bingung setelah bertemu
-e
. Dalam contoh Andased 's/foo/bar/'
dansed -e 's/foo/bar/'
setara. Dalam kedua kasus tersebuts/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 samased
. 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 pertamas/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-61sumber