Como usar o bash para alfabetizar entradas em um arquivo de configuração, preservando a numeração sequencial?

2

Eu tenho um arquivo .ini com esse padrão:

[Preset0]
Data=78367571EE5E
Data_1=3483290482
Data_2=299230-293
Data_3=2390920391
Name=Mono Lead
Len=3994
[Preset1]
Data=78367571EE5E
Data_1=3483290482
Data_2=299230-293
Data_3=2390920391
Name=Funky Bass
Len=4001
[Preset2]
Data=0200002E3434
Data_1=342EFD340433
Data_2=000000043425
Data_3=EDFE00000000
Name=Airy Pad
Len=3713

Cada conjunto de dados de [PresetX] a Len=X representa uma predefinição. Quero alfabetizar essa lista por Name=X . No entanto, preciso que a primeira predefinição do arquivo seja [Preset0] e preciso que as predefinições permaneçam em ordem numérica. Então, minha saída desejada seria:

[Preset0]
Data=0200002E3434
Data_1=342EFD340433
Data_2=000000043425
Data_3=EDFE00000000
Name=Airy Pad
Len=3713
[Preset1]
Data=78367571EE5E
Data_1=3483290482
Data_2=299230-293
Data_3=2390920391
Name=Funky Bass
Len=4001
[Preset2]
Data=78367571EE5E
Data_1=3483290482
Data_2=299230-293
Data_3=2390920391
Name=Mono Lead
Len=3994

Como eu faria isso com o bash?

    
por 3x5 01.11.2017 / 21:16

1 resposta

1

Eu não sei como classificar e incrementar com sed , então essa solução mistura sed , bash e sort .

sed -r ':a;N;s/\n/|/;/Len=/{s/(.*Name=)(.*)(Len=.*)//p;d};ba' presets-file |
sort |
while read line; do
    sed -r 's/(.*\|)(\[Preset)[0-9]+(\].*)(Len=.*)/'$((i++))'/;s/\|/\n/g' <<<"$line"
done
    
por 02.11.2017 / 14:03