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
.