En voici une autre sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Cela fait ce que vous demandez. Il fonctionne simplement sur une pile - en la construisant si nécessaire et aussi longtemps que nécessaire entre les occurrences de lignes commentées, et en vidant l'ancien tampon en faveur de la nouvelle ligne commentée plus loin en entrée lorsqu'il en trouve une. Image...
Désolé, je ne sais pas pourquoi j'ai fait ça. Mais cela m'est venu à l'esprit.
Quoi qu'il en soit, sed
répartit ses tampons entre chaque dernière ligne commentée dans n'importe quelle série, ne conservant jamais un seul plus dans son tampon que nécessaire pour suivre avec précision la dernière occurrence commentée, et si à tout moment il rencontre la dernière ligne en faisant cela, il tentera la La dernière g
instruction d'exécution t
globale et la branche est l'ensemble du tampon à imprimer, sinon elle imprimera P
toutes les lignes qu'elle libère de son tampon dès qu'elle le fera.
Je suppose que c'est ce qui a fait penser aux accordéons ...
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
Il n'y a qu'une seule différence entre cette commande et celle ci-dessus et c'est la l
commande ook en haut. Lorsque nous l
OOK à sed
l'espace modèle de » que cela fonctionne , nous pouvons avoir une meilleure idée de ce qui se passe dans les coulisses et une meilleure compréhension de la façon de diriger ses efforts.
Dans ce cas, nous pouvons regarder l' sed
entrée de la pile jusqu'à ce qu'elle ait trouvé une deuxième occurrence de \n#.*\ndotan
in input, et cela lorsqu'il commence à imprimer la précédente une ligne à la fois. C'est plutôt cool. J'ai beaucoup appris en travaillant là-dessus.