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:
-
sedinsere 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. -
splitgera pedaços, tendo registros separados por caracteres nulos, um registro por pedaço. Em vez de gravar em arquivos,splitchama um filtro para cada parte separadamente:- primeiro
trexclui caracteres nulos; - , em seguida,
readeprintfapenas ecoam a primeira linha (cabeçalho) do bloco; - finalmente
sortfaz seu trabalho com as linhas restantes.
- primeiro
- Os pedaços são processados sequencialmente; a saída é um único fluxo concatenado.