Aqui está outro sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Isso faz o que você pede. Ele simplesmente funciona em uma pilha - construindo-a quando necessário e pelo tempo necessário entre ocorrências de linhas comentadas e descartando o buffer antigo em favor da nova linha comentada mais adiante na entrada quando encontrar uma. Cenário...
Desculpe, não sei por que fiz isso. Mas isso veio à mente.
De qualquer forma, sed
espalha seus buffers entre cada última linha comentada de qualquer série, nunca retendo um único mais em seu buffer do que o necessário para rastrear com precisão a última ocorrência comentada e, a qualquer momento, encontra a última linha ao fazê-lo. A g
instrução final de execução t
global e a ramificação são o buffer inteiro a ser impresso, caso contrário, ele criará P
todas as linhas que liberar do buffer assim que o fizer.
Acho que foi isso que trouxe os acordeões à mente ...
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
Há apenas uma diferença entre este comando e o acima e esse é o l
comando ook no topo. Quando nós l
ook em sed
's espaço de padrões como ele funciona, podemos ter uma melhor idéia do que se passa nos bastidores e uma melhor compreensão de como direcionar seus esforços.
Nesse caso, podemos observar a sed
entrada da pilha até encontrar uma segunda ocorrência de \n#.*\ndotan
entrada, e quando ela começa a imprimir a linha anterior por vez. É meio legal. Eu aprendi muito trabalhando nisso.