#begin command block
#append all lines between two addresses to hold space
sed -n -f - <<\SCRIPT file.xml
\|<tag1>|,\|</tag1>|{ H
#at last line of search block exchange hold and pattern space
\|</tag1>|{ x
#if not conditional ; clear buffer ; branch to script end
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
#do work ; print result; clear buffer ; close blocks
s?*?*?;p;s/.*//;h;b}}
SCRIPT
Jika Anda melakukan hal di atas, mengingat data yang Anda perlihatkan, sebelum garis pembersihan terakhir di sana, Anda harus bekerja dengan sedruang pola yang terlihat seperti:
^\n<tag1>\n<tag2>foo</tag2>\n</tag1>$
Anda dapat mencetak ruang pola Anda kapan pun Anda suka dengan look. Anda kemudian dapat mengatasi \nkarakter.
sed l <file
Akan menunjukkan kepada Anda setiap baris sedmemprosesnya pada tahap yang ldisebut.
Jadi saya baru saja mengujinya dan perlu satu lagi \backslashsetelah ,commadi baris pertama, tetapi jika tidak berfungsi sebagaimana mestinya. Di sini saya memasukkannya ke dalam _sed_functionsehingga saya dapat dengan mudah menyebutnya untuk tujuan demonstrasi di seluruh jawaban ini: (berfungsi dengan komentar yang disertakan, tetapi di sini dihapus karena singkatnya)
_sed_function() { sed -n -f /dev/fd/3
} 3<<\SCRIPT <<\FILE
\|<tag1>|,\|</tag1>|{ H
\|</tag1>|{ x
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
s?*?*?;p;s/.*//;h;b}}
#END
SCRIPT
<tag1>
<tag2>bar</tag2>
</tag1>
<tag1>
<tag2>foo</tag2>
</tag1>
FILE
_sed_function
#OUTPUT#
<tag1>
<tag2>foo</tag2>
</tag1>
Sekarang kita akan mengganti pa lsehingga kita dapat melihat apa yang sedang kita kerjakan saat kita mengembangkan skrip kita dan menghapus demo non-op s?sehingga baris terakhir dari kita sed 3<<\SCRIPTterlihat seperti:
l;s/.*//;h;b}}
Maka saya akan menjalankannya lagi:
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
Baik! Jadi saya benar - itu perasaan yang bagus. Sekarang, mari kita mengocok look kita untuk melihat garis yang menarik tetapi menghapus. Kami akan menghapus arus kami ldan menambahkannya !{block}sehingga terlihat seperti:
!{l;s/.*//;h;b}
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
Seperti apa itu sebelum kita memusnahkannya.
Satu hal terakhir yang ingin saya tunjukkan kepada Anda adalah Hruang lama saat kami membangunnya. Ada beberapa konsep kunci yang saya harap bisa saya tunjukkan. Jadi saya menghapus look terakhir lagi dan mengubah baris pertama untuk menambahkan mengintip ke Hruang lama di akhir:
{ H ; x ; l ; x
_sed_function
#OUTPUT#
\n<tag1>$
\n<tag1>\n <tag2>bar</tag2>$
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
\n<tag1>$
\n<tag1>\n <tag2>foo</tag2>$
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
Hruang lama bertahan siklus garis - karenanya namanya. Jadi yang sering membuat orang tersandung - ok, yang sering membuat saya tersandung - adalah perlu dihapus setelah Anda menggunakannya. Dalam hal ini saya hanya xmengubah sekali, jadi ruang penahanan menjadi pola ruang dan sebaliknya dan perubahan ini juga bertahan siklus garis.
Efeknya adalah bahwa saya perlu menghapus ruang palka saya yang dulunya ruang pola saya. Saya melakukan ini dengan terlebih dahulu membersihkan ruang pola saat ini dengan:
s/.*//
Yang cukup memilih setiap karakter dan menghapusnya. Saya tidak dapat menggunakan dkarena ini akan mengakhiri siklus baris saya saat ini dan perintah berikutnya tidak akan selesai, yang akan cukup banyak membuang skrip saya.
h
Ini bekerja dengan cara yang mirip dengan Htetapi itu menimpa ruang penyimpanan, jadi saya baru saja menyalin ruang pola kosong saya di atas ruang penyimpanan saya, secara efektif menghapusnya. Sekarang saya bisa:
b
di luar.
Dan itulah cara saya menulis sedskrip.