Saya mencoba menemukan pola menggunakan sed perintah di file.txt antara char1 pertama dan char2 dan kemudian menggantinya dengan string. seperti di bawah ini dengan echo contoh modus:
echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'
Saya juga perlu menyimpan pola yang cocok (seperti is test {<–spasi di sekitar penting} ) dalam sebuah variabel.
Jawaban yang Diterima:
Berikut adalah permintaan tunggal sed yang menulis baris yang direvisi ke stdout sementara pada saat yang sama menyimpan teks yang dihapus dalam variabel shell var :
$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.
Nilai var adalah:
$ echo "==$var=="
== is test ==
Penjelasan:
-
hPerintah ini menyalin pola saat ini ke ruang penahanan.
-
s/[^X]*X([^Y]*)Y.*/\1/;pIni menghapus semuanya dari ruang pola kecuali teks di antara
Xfirst pertama danYtermasuk spasi apapun. Ini kemudian dicetak ke stdout. Ini adalah output yang ditangkap oleh shell dan ditetapkan kevar. -
xIni menyalin ruang penahan kembali ke ruang pola. Ketika ini selesai, ruang pola berisi salinan dari baris input asli.
-
s/X[^Y]*Y/REPLACE/; w /dev/stderrSubstitusi dilakukan dan hasilnya ditulis ke
stderr. -
2>&1Setelah shell menangkap stdout ke dalam
var, ini memerintahkan shell untuk menyalin stderr (yang memiliki baris dengan REPLACE) ke stdout.
Selain menangani variabel var
Variabel var termasuk spasi awal dan akhir. Jika shell selanjutnya menjadi subjek var untuk pemisahan kata, spasi ini akan dihapus. Untuk mencegahnya, ketika var direferensikan, lakukan di dalam tanda kutip ganda, seperti pada contoh di atas.