#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 sed
ruang pola yang terlihat seperti:
^\n<tag1>\n<tag2>foo</tag2>\n</tag1>$
Anda dapat mencetak ruang pola Anda kapan pun Anda suka dengan l
ook. Anda kemudian dapat mengatasi \n
karakter.
sed l <file
Akan menunjukkan kepada Anda setiap baris sed
memprosesnya pada tahap yang l
disebut.
Jadi saya baru saja mengujinya dan perlu satu lagi \backslash
setelah ,comma
di baris pertama, tetapi jika tidak berfungsi sebagaimana mestinya. Di sini saya memasukkannya ke dalam _sed_function
sehingga 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 p
a l
sehingga 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<<\SCRIPT
terlihat 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 l
ook kita untuk melihat garis yang menarik tetapi menghapus. Kami akan menghapus arus kami l
dan 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 H
ruang lama saat kami membangunnya. Ada beberapa konsep kunci yang saya harap bisa saya tunjukkan. Jadi saya menghapus l
ook terakhir lagi dan mengubah baris pertama untuk menambahkan mengintip ke H
ruang 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>$
H
ruang 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 x
mengubah 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 d
karena 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 H
tetapi 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 sed
skrip.