如何使用 bash 按字母顺序排列配置文件中的条目并保留连续编号?

如何使用 bash 按字母顺序排列配置文件中的条目并保留连续编号?

我有一个.ini具有这种模式的文件:

[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

[PresetX]从到的每组数据Len=X代表一个预设。我想按字母顺序排列此列表Name=X。但是,我需要文件中的第一个预设是[Preset0],并且我需要预设保持数字顺序。因此,我想要的输出将是:

[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

我该如何用 bash 来做到这一点?

答案1

我不知道如何使用 进行排序和递增sed,因此这个解决方案混合了sedbashsort

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

相关内容