Sayısal organizasyon şemasına değişken sıfırlar eklemek için sed sözdizimimi almayla ilgili sorun yaşıyorum. Üzerinde çalıştığım dizeler
1.1.1.1,Some Text Here
sed sözdiziminden yararlanma
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
Cevabı ortaya çıkarabiliyorum
01.01.01.01,Some Text Here
Ancak, aradığım şey, alan 4 ve 2 ve 3 ve 3 basamaklı alanlardaki 2 basamağa kadar sıfır dolduracak bir şeydir, böylece tüm öğeler [0-9] 'da standart uzunluktadır. [0-9] { 2}. [0-9] {2}. [0-9] {3}
1.01.01.001,Some Text Here
Hayatım boyunca, sadece bir periyodu takip eden rakamlara yapışmak için gerekli parametreleri içerecek şekilde sınırın nasıl değiştirileceğini bile anlayamıyorum. Ben bir kelime sınırında sıfır karakter eşleştiğini anlamak \ b kullanımı ile ilgili bir şey olduğunu düşünüyorum, ama neden maç için bir dönem eklemek için denemelerimi aşağıdaki gibi başarısız anlamıyorum:
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
Ayrıca, ifade gibi metin içeriyorsa ek sorunlar olacağını bekliyoruz:
1.1.1.1,Some Number 1 Here
Sed ve tüm karmaşıklıklarını gerçekten öğrenmem gereken, vazgeçilmez bir sonuçtur. Bunun üzerinde çalışıyorum, ancak bu ifadenin bir süre bana sorun çıkarmaya devam edeceğini umuyorum. Herhangi bir yardım büyük mutluluk duyacağız.
DÜZENLEME: Bir yol buldum ... Bu ifade aradığım şeyi yapıyor gibi görünüyor, ama bunu yapmak için daha zarif bir yolu olmalı.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Ayrıca, sözdizimsel olarak metinde benzer bir sayı biçimi görünürse sorunlara neden olur ... benzer:
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
Bu durumda aşağıdakilerle sonuçlanır:
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
Çözüldü Yardımlarınız için hepinize teşekkür ederim. Sorunu başlangıçta aşağıda kabul ettiğim cevapla çözdüm. Aşağıdaki tür kaldıraç daha büyük bir çözümün bir parçası olarak çözüm Python taşındı hissettim:
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
(veya printf
awk içinde arama) daha kolay olabilir.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Ancak, daha zarif bir yaklaşım olup olmadığını bilmek isterim.