sed -e :p -e '/(((/!b
' -e :n -e 's/)))/\
/; s/(((.*\n//; tp
$d;N; s//(((/; tn'
Isso deve ser feito. Será b ranch away (e consequentemente autoprint) qualquer linha que não corresponda a ((( , mas uma vez encontrada, tenta remover tudo entre a primeira sequência ((( e a primeira% ))) . Se não puder, porque o ))) à direita não é encontrado na linha atual, ele extrai a linha N ext, remove tudo entre ((( e a cabeça da próxima linha e pesquisa novamente. Se chegar ao final da última linha $ enquanto ainda estiver pesquisando por ))) , ela desiste. Dessa forma, ele nunca armazena mais do que uma linha de cada vez, pois remove tudo o que segue ((( cada vez que ele precisa puxar uma nova linha.
Ele deve lidar com quantos pares ((( ))) , como pode ocorrer em uma linha - e não importa se ( ou ) ocorrer entre as duas extremidades - ele buscará 2% ou menos ) e qualquer número de ( .
Depois de encontrar ))) , ele é redefinido para uma pesquisa por ((( e, por isso, não consegue lidar com o próximo par, mesmo depois de cruzar limites de linha nova.
-
:p - declara o rótulo da ramificação p . O script se divide aqui se puder substituir uma sequência ))) por uma nova linha e, em seguida, remover tudo entre ((( e \n .
-
/(((/!b - b ranch away - e autoprint pattern space - se não houver seqüências ((( restantes no espaço padrão.
-
:n - declara a filial : label n . O script ramifica aqui se um ((( for encontrado, mas um ))) não pode ser encontrado na mesma linha.
-
s/)))/\n/ - substitui a primeira ocorrência de ))) por uma nova linha. Isso só acontece se um ((( já tiver sido correspondido.
-
s/(((.*\n// - substitua tudo entre o primeiro ((( e o único \n ewline no espaço padrão.
-
tp - t est para uma substituição bem-sucedida; se verdadeiro, ramifique-se para rotular :p .
-
$d;N - a última substituição não foi bem sucedida; se a linha atual for a $ last d elete, mais anexe o N ext ao espaço de padrão.
-
s//(((/;tn - repete a última regexp e substitui todos os que estão entre os ((( e a nova linha que acabou de ser adicionada para ((( , depois ramifique para a etiqueta :n .