Ini yang lain sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Itu sesuai dengan yang Anda minta. Ini hanya bekerja pada tumpukan - membangunnya bila perlu dan selama diperlukan antara kemunculan baris yang dikomentari, dan membuang buffer lama demi baris komentar baru lebih lanjut di input ketika menemukan satu. Gambar...
Maaf, saya tidak tahu mengapa saya melakukan itu. Tapi itu terlintas dalam pikiran.
Bagaimanapun, sed
sebarkan buffernya di antara setiap baris komentar terakhir dalam seri apa pun, jangan pernah menyimpan satu pun buffer lebih dari yang diperlukan untuk secara akurat melacak kejadian yang terakhir dikomentari, dan jika sewaktu-waktu ia menemukan baris terakhir saat melakukan itu akan mencoba g
pernyataan eksekusi lobal terakhir dan cabang t
seluruh buffer keluar untuk dicetak, kalau tidak itu akan P
membatalkan semua baris yang dilepaskan dari buffer segera setelah itu.
Saya kira inilah yang membawa akordeon ke pikiran ...
printf %s\\n \#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric |
sed -e:n -e'l;/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D
#alice
#alice\n#bob$
#alice\n#bob\ncharlie$
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob
#charlie
#dotan
eric
Hanya ada satu perbedaan antara perintah ini dan yang di atas dan itu adalah l
perintah ook di atas. Ketika kita l
melihat sed
ruang pola saat berfungsi, kita bisa mendapatkan ide yang lebih baik tentang apa yang terjadi di balik layar dan pemahaman yang lebih baik tentang bagaimana mengarahkan usahanya.
Dalam hal ini kita dapat menonton sed
input tumpukan hingga menemukan kemunculan \n#.*\ndotan
input kedua, dan ketika itu mulai mencetak baris sebelumnya pada satu waktu. Agak keren. Saya belajar banyak tentang ini.