Saya mengalami kesulitan menurunkan sintaks sed saya untuk menambahkan angka nol terkemuka yang bervariasi ke skema organisasi numerik. String yang saya operasikan muncul seperti
1.1.1.1,Some Text Here
meningkatkan sintaks sed
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
Saya dapat memperoleh respons
01.01.01.01,Some Text Here
Namun, yang saya cari adalah mengisi nol hingga 2 digit di bidang 2 dan 3 dan 3 di bidang 4 sehingga semua item memiliki panjang standar di [0-9]. [0-9] { 2}. [0-9] {2}. [0-9] {3}
1.01.01.001,Some Text Here
Untuk kehidupan saya, saya bahkan tidak bisa membayangkan bagaimana mengubah batas untuk memasukkan parameter yang diperlukan untuk mengambil hanya angka setelah periode. Saya pikir itu ada hubungannya dengan penggunaan \ b yang saya pahami cocok dengan nol karakter pada batas kata, tetapi saya tidak mengerti mengapa upaya saya untuk menambahkan periode pada pertandingan gagal sebagai berikut:
sed -r ":r;s/\.\b[0-9]{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b\.[0-9]{1,$((1))}\b/0&/g;tr"
Both cause the statement to hang
sed -r ":r;s/\b[0-9]\.{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\.\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\b\./0&/g;tr"
cause the statement to output:
1.01.01.1,Some Text Here
Selain itu, saya berharap bahwa saya akan memiliki masalah tambahan jika pernyataan itu berisi teks seperti:
1.1.1.1,Some Number 1 Here
Ini adalah kesimpulan terdahulu bahwa saya harus benar-benar belajar sed dan semua kerumitannya. Saya sedang mengerjakan itu, tetapi berharap bahwa pernyataan khusus ini akan terus membuat saya kesulitan untuk sementara waktu. Bantuan apa pun akan sangat dihargai.
EDIT: Saya sudah menemukan cara ... Pernyataan ini tampaknya melakukan apa yang saya cari, tetapi harus ada cara yang lebih elegan untuk melakukan ini.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Juga, secara sintaksis ini akan menyebabkan masalah jika format angka yang serupa muncul dalam teks ... mirip dengan:
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
Dalam hal ini akan menghasilkan:
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
Diselesaikan Terima kasih semua atas bantuan Anda di sini. Saya awalnya memecahkan masalah dengan jawaban yang saya terima di bawah. Saya rasa telah memindahkan solusi ke Python sebagai bagian dari solusi yang lebih besar memanfaatkan jenis di bawah ini:
def getPaddedKey(line):
keyparts = line[0].split(".")
keyparts = map(lambda x: x.rjust(5, '0'), keyparts)
return '.'.join(keyparts)
s=sorted(reader, key=getPaddedKey)
printf
(atau printf
panggilan dalam Bahasa Inggris) mungkin lebih mudah.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Namun, saya ingin tahu apakah ada pendekatan yang lebih elegan.