Aqui está outro sed
:
sed '/.*<div class="...">.*/{ h;s///;x;:n
/<.div>/!N;/<!-- end/x;/<.div>/x;//!bn
s/\(.*\).\(<div class=.*>\).*//;x
/<.div>[^>]*$/s/.//;H;x
}'
A partir de uma linha class=.???.
e passando por quantos blocos você tiver, para cada par, isso alterna suas posições. Então, aqui estão alguns exemplos:
Se sed
encontrar uma linha que corresponda a:
<div class=".\{3\}">
... ao ler seu arquivo, ele garante que H
old space esteja completamente livre e comece a puxar todas as linhas até encontrar uma linha que corresponda a:
<.div>
... e ...
<!-- end
... ou apenas o primeiro. Se corresponder a ambos, sed
salvará o bloco em um buffer alternativo e puxará um segundo bloco antes de trocar suas posições na saída.
Se apenas o primeiro não afeta a posição dos blocos. Desta forma, os pares são deixados em paz.
Dado como entrada ...
<div class="wrapper">
<div class="aaa"> first </div> <!-- end aaa -->
between
<div class="bbb"> swap two </div> <!-- end bbb -->
blocks
<div class="ccc"> mismatched </div> <!-- end ccc -->
the end
</div>
Imprime ...
<div class="wrapper">
<div class="bbb"> swap two </div> <!-- end bbb -->
between
<div class="aaa"> first </div> <!-- end aaa -->
blocks
<div class="ccc"> mismatched </div> <!-- end ccc -->
the end
</div>
... se dado:
<div class="wrapper">
<div class="aaa"> first </div> <!-- end aaa -->
between
<div class="bbb"> swap two </div> <!-- end bbb -->
blocks
<div class="ccc"> matched </div> <!-- end ccc -->
the end
<div class="ddd"> now matched </div> <!-- end ddd -->
</div>
Imprime ...
<div class="wrapper">
<div class="bbb"> swap two </div> <!-- end bbb -->
between
<div class="aaa"> first </div> <!-- end aaa -->
blocks
<div class="ddd"> now matched </div> <!-- end ddd -->
the end
<div class="ccc"> matched </div> <!-- end ccc -->
</div>
E, embora os exemplos estejam todos amassados assim por causa do espaço, não há uma preocupação real em saber se as seções <div class=
begin e <.div> <!-- end
estão ou não na mesma linha:
<div class="wrapper">
<div class="aaa">
the first
block is here
</div> <!-- end aaa -->
these lines were
between aaa and bbb
<div class="bbb">
this is the second block
it should be swapped with the first
</div> <!-- end bbb -->
more
blocks
follow
<div class="ccc"> this is matched </div> <!-- end ccc -->
not the end
<div class="ddd">
this last block
is matched with the ccc line
</div> <!-- end ddd -->
this is the end
</div>
Obtém ...
<div class="wrapper">
<div class="bbb">
this is the second block
it should be swapped with the first
</div> <!-- end bbb -->
these lines were
between aaa and bbb
<div class="aaa">
the first
block is here
</div> <!-- end aaa -->
more
blocks
follow
<div class="ddd">
this last block
is matched with the ccc line
</div> <!-- end ddd -->
not the end
<div class="ccc"> this is matched </div> <!-- end ccc -->
this is the end
</div>