Jak używać bash do alfabetycznego wprowadzania wpisów w pliku konfiguracyjnym, zachowując sekwencyjną numerację?


2

Mam .iniplik z tym wzorem:

[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

Każdy zestaw danych od [PresetX]do Len=Xreprezentuje jedno ustawienie wstępne. Chcę uporządkować tę listę alfabetycznie Name=X. Potrzebuję jednak pierwszego ustawienia wstępnego w pliku [Preset0]i ustawienia wstępne muszą pozostać w kolejności numerycznej. Tak więc moim pożądanym wynikiem byłoby:

[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

Jak miałbym to zrobić za pomocą bash?


2
Twoje przykładowe dane nie pokazują, że masz problem. Czy ustawienia wstępne są już w kolejności numerycznej? Jeśli tak, to jak możesz sortować według nazwy?
glenn jackman

Niestety, ustawienia wstępne są już w kolejności numerycznej. Nazwy nie są w kolejności alfabetycznej. Potrzebuję więc każdego zestawu ustawień (Dane, Dane_1, Dane_2, Dane_3, Nazwa, Len), aby przejść w kolejności alfabetycznej, bez zmiany kolejności numerów.
3x5

1
Nadal nie rozumiem. Pokaż więcej niż jedną kompletną sekcję i pożądane wyniki
glenn jackman

Też nie rozumiem. Jeśli Presetkolejność numeryczna nie zgadza się z Namekolejnością alfabetyczną, musisz ją wybrać. Wygląda na to, że plik jest już w kolejności numerycznej Preset. Czy chcesz przenieść cały Presetblok, aby ułożyć bloki w kolejności alfabetycznej Name?
Paulo

Tak Paulo, chcę uporządkować całe bloki. Zredagowałem mój OP, aby był bardziej przejrzysty.
3x5

Odpowiedzi:


1

Nie wiem, jak sortować i przyrost z sed, więc to rozwiązanie mieszanki sed, bashi sort.

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

Cieszę się, że to pomogło. Zapomniałem dodać, że jeśli jedna z linii zawiera a, |to nie zadziała, ponieważ wszystkie nowe linie \nbloku są zastępowane przez |w pierwszym sed, a w drugim sed \nsą odkładane. W takim przypadku powinieneś zastąpić go innym „nie występującym” znakiem.
Paulo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.