Isso funciona no meu Debian:
sed '1 ! s/^\[/\x00\[/g' |
split -t 'sed '1 ! s/^\[/\x00\[/g' |
split -t '%pre%' -l 1 --filter='
tr -d "%pre%" |
{ IFS="" read; printf "%s\n" "$REPLY"; sort; }
'
' -l 1 --filter='
tr -d "%pre%" |
{ IFS="" read; printf "%s\n" "$REPLY"; sort; }
'
Para trabalhar com arquivo (s), use redirecionamento (s), por exemplo. { sed … ; } <input.txt >output.txt
, em que sed …
é o comando inteiro.
O procedimento é o seguinte:
-
sed
insere caractere nulo antes de cada[
que está no início de uma linha, a menos que a linha seja a primeira. Desta forma, os caracteres nulos separam os perfis. -
split
gera pedaços, tendo registros separados por caracteres nulos, um registro por pedaço. Em vez de gravar em arquivos,split
chama um filtro para cada parte separadamente:- primeiro
tr
exclui caracteres nulos; - , em seguida,
read
eprintf
apenas ecoam a primeira linha (cabeçalho) do bloco; - finalmente
sort
faz seu trabalho com as linhas restantes.
- primeiro
- Os pedaços são processados sequencialmente; a saída é um único fluxo concatenado.