Tulis ulang perintah sed untuk mengedit aliran alih-alih file

Dalam kasus normal, sed dapat mengedit aliran dari perintah lain hanya dengan melakukan piping:

./somecommand | sed 's/xx/yy/g'

Namun, perintah sed yang saya gunakan agak rumit. Sebelumnya, saya mendapat bantuan dalam mengoptimalkan sed untuk kasus penggunaan tertentu: Optimalkan skrip shell untuk beberapa penggantian sed

Hasil akhirnya adalah untuk kasus penggunaan saya, perintah sed berikut adalah yang paling optimal:

./somecommand > file
sed -e 's/^/s|/; s/$/|g/;' replacement_list | sed -r -f - -i file

Pada dasarnya, perintah sed pertama membuat daftar operasi sed dari file dengan pasangan substitusi. Perintah sed kedua kemudian menggunakan aliran melalui perpipaan dan menggunakan opsi -f untuk memproses file.

Segalanya telah berubah sedikit sejak itu dan sekarang saya berhasil membuat somecommand menampilkan hasil di stdout alih-alih menulis ke file, tetapi saya tidak dapat memikirkan cara untuk menulis ulang rangkaian perintah di atas dengan benar. Bagian kesulitannya adalah perintah sed kedua sudah menggunakan aliran dari perintah sed pertama.

Satu hal yang saya coba adalah menetapkan stdout dari somecommand ke sebuah variabel dan mencoba memasukkan <<< ke dalam perintah sed kedua. Namun, hal itu tidak berhasil.


person Reuben L.    schedule 18.09.2014    source sumber


Jawaban (1)


Anda dapat menyiasatinya dengan menggunakan ekspansi inline pada shell (menurut saya begitulah namanya, koreksi saya jika saya salah).

./somecommand | sed -r -e "`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"

Perhatikan tanda kutip terbalik di dalam tanda kutip ganda, ini akan menyebabkan stdout dari perintah sed bagian dalam ditempatkan di dalam tanda kutip ganda.

Meskipun demikian, ini berbahaya sehingga Anda mungkin ingin mencoba menyimpan output dari perintah sed bagian dalam ke variabel shell terlebih dahulu seperti ini

sedcommand="`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"
./somecommand | sed -r -e "$sedcommand"
person randomusername    schedule 18.09.2014
comment
./somecommand | sed -r -e "$( sed -e 's/^/s|/; s/$/|g/;' replacement_list )" tidak perlu lagi keluar di dalam tanda kutip ganda atau menggunakan tanda kutip ganda daripada garis miring terbalik yang sederhana atau multi kejadian seperti s/\\\\/\\\\\\\\/g - person NeronLeVelu; 19.09.2014