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)
sumber
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.printf
(atauprintf
panggilan dalam Bahasa Inggris) mungkin lebih mudah.Jawaban:
Pemakaian:
leading_zero.sh input.txt
Penjelasan:
input.txt
output.txt
sumber
perl
versi ini tidak menghapus garis miring terbalik.bash dapat menangani ini. Ini akan jauh lebih lambat daripada perl:
sumber
printf
, alat yang masuk akal. (Awkprintf
juga dirancang dan lebih baik daripadabash
untuk pemrosesan teks.) Juga lihat Mengapa menggunakan shell loop untuk memproses teks dianggap praktik buruk?Anda belum secara khusus meminta
perl
solusi tetapi ini ada satu. Secara pribadi saya pikir ini sedikit lebih mudah dibaca, terutama ketika dipecah menjadi beberapa baris.Pertama di sini adalah one-liner:
Hasilnya:
Dan inilah
perl
skrip yang rusak dan dikomentari (-n
flag menempatkanwhile read; do ... done
loop implisit di sekitar kode):sumber
awk
akan bekerja juga - prinsip yang sama menggunakanprintf
Inilah satu pendekatan yang mungkin:
sed -E 's/([0-9]*\.)/0\1/g;s/.//;s/([0-9]*,)/00\1/'
Contohnya
Juga bekerja dengan string ini:
... dan string ini:
sumber
Penjelasan:
Metode yang digunakan di sini adalah dengan melihat lingkungan numerik dan mengambil tindakan berdasarkan itu. Jadi, angka 2 dan 3 melihat titik di kedua sisi sedangkan angka 4 melihat titik di sebelah kiri dan koma di sebelah kanan.
$ 1 diatur ketika regex mengambil lintasan ke-2 atau ke-3 dan sesuai dengan ketelitian bantalan 2. OTOH, untuk angka ke-4, bantalan adalah 3.
% cat file.txt
Hasil:
sumber