Aquí hay otro sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Eso hace lo que pides. Simplemente funciona en una pila, construyéndolo cuando sea necesario y durante el tiempo que sea necesario entre las ocurrencias de las líneas comentadas, y volcando el búfer viejo a favor de la nueva línea comentada más adelante en la entrada cuando encuentra una. Imagen...
Lo siento, no sé por qué hice eso. Pero me vino a la mente.
De todos modos, sed
extiende sus búferes entre cada última línea comentada en cualquier serie, sin retener nunca más en su búfer de lo necesario para rastrear con precisión la última ocurrencia comentada, y si en algún momento encuentra la última línea mientras lo hace, intentará la g
declaración final de ejecución lobal y la ramificación t
están imprimiendo todo el búfer, de lo contrario borrará P
todas las líneas que libera de su búfer tan pronto como lo haga.
Supongo que esto es lo que me hizo pensar en los acordeones ...
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
Solo hay una diferencia entre este comando y el anterior y ese es el l
comando ook en la parte superior. Cuando l
OOK en sed
's espacio de patrones, ya que funciona podemos tener una mejor idea de lo que sucede detrás de las escenas y una mejor comprensión de cómo dirigir sus esfuerzos.
En este caso, podemos observar la sed
entrada de la pila hasta que haya encontrado una segunda aparición de \n#.*\ndotan
entrada, y eso cuando comience a imprimir la línea anterior de una en una. Es un poco genial. Aprendí mucho trabajando en esto.