Bagaimana cara saya menggunakan bash untuk membuat alfabet entri dalam file konfigurasi, mempertahankan penomoran berurutan?

2

Saya punya .inifile dengan pola 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

Setiap set data dari [PresetX]untuk Len=Xmewakili satu preset. Saya ingin membuat daftar ini menurut abjad Name=X. Namun, saya memerlukan preset pertama dalam file [Preset0]dan saya perlu preset untuk tetap dalam urutan angka. Jadi, output yang saya inginkan adalah:

[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

Bagaimana saya melakukan ini dengan bash?

3x5
sumber
2
Contoh data Anda tidak menunjukkan bahwa Anda memiliki masalah. Apakah preset sudah dalam urutan numerik? Jika ya, bagaimana Anda bisa mengurutkan berdasarkan Nama?
glenn jackman
Maaf, preset sudah dalam urutan numerik. Nama tidak dalam urutan abjad. Jadi saya membutuhkan masing-masing preset (Data, Data_1, Data_2, Data_3, Name, Len) untuk masuk dalam urutan abjad, tanpa mengatur ulang angka preset.
3x5
1
Masih tidak mengerti. Perlihatkan lebih dari satu bagian lengkap dan hasil yang Anda inginkan
glenn jackman
Saya juga tidak mengerti. Jika Preseturutan numerik tidak cocok dengan Nameurutan abjad, maka Anda harus memilih satu. Tampaknya file tersebut sudah dalam urutan numerik Preset. Apakah Anda ingin memindahkan seluruh Presetblok untuk menempatkan blok dalam urutan abjad Name?
Paulo
Ya Paulo, saya ingin menyortir seluruh blok. Saya telah mengedit OP saya agar lebih jelas.
3x5

Jawaban:

1

Saya tidak tahu cara memilah dan menambah sed, jadi solusi ini bercampur sed, bashdan 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
Paulo
sumber
Saya senang itu membantu. Saya lupa menambahkan bahwa jika salah satu baris berisi |itu tidak akan berfungsi, karena semua baris baru \nblok digantikan oleh |di sed pertama, dan di sed kedua \nyang dikembalikan. Dalam hal ini Anda harus menggantinya dengan karakter 'tidak terjadi' lainnya.
Paulo