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:
-
h
Perintah ini menyalin pola saat ini ke ruang penahanan.
-
s/[^X]*X([^Y]*)Y.*/\1/;p
Ini menghapus semuanya dari ruang pola kecuali teks di antara
X
first pertama danY
termasuk spasi apapun. Ini kemudian dicetak ke stdout. Ini adalah output yang ditangkap oleh shell dan ditetapkan kevar
. -
x
Ini 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/stderr
Substitusi dilakukan dan hasilnya ditulis ke
stderr
. -
2>&1
Setelah 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.