У мене виникають проблеми зі скороченням синтаксису sed, щоб додати різну кількість провідних нулів до числової організаційної схеми. Струни, над якими я оперую, виглядають як
1.1.1.1,Some Text Here
використання синтаксису sed
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
Я в змозі отримати відповідь
01.01.01.01,Some Text Here
Однак те, що я шукаю, - це те, що нульове заповнення до двох цифр у полях 2 та 3 та 3 цифр у полі 4, щоб усі елементи були стандартної довжини у [0-9]. [0-9] { 2}. [0-9] {2}. [0-9] {3}
1.01.01.001,Some Text Here
Протягом життя я не можу зрозуміти навіть, як змінити межу, щоб включити параметри, необхідні для оснащення лише цифрами після певного періоду. Я думаю, що це має щось спільне з використанням \ b, яке я розумію, відповідає нульовим символам на межі слова, але я не розумію, чому мої спроби додати період до відповідності провалюються так:
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
Крім того, я очікую, що у мене виникнуть додаткові проблеми, якщо виписка містить такий текст, як:
1.1.1.1,Some Number 1 Here
Це заздалегідь зроблений висновок, що мені потрібно справді вивчити сед та всі його складності. Я працюю над цим, але сподіваюся, що ця конкретна заява на деякий час буде створювати мені неприємності. Будь-яка допомога буде дуже вдячна.
EDIT: Я вигадав спосіб ... Це твердження, здається, робить те, що я шукаю, але повинен бути більш елегантний спосіб зробити це.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Також синтаксично це спричинить проблеми, якщо в тексті з'явиться аналогічний формат чисел ... подібний до:
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
У такому випадку це призведе до:
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
Вирішено Дякую всім за допомогу тут. Я спочатку вирішив проблему з відповіддю, який я прийняв нижче. Я відчуваю, що рішення перенесло на Python як частину більшого рішення, що використовує тип нижче:
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
(або printf
дзвінок у Awk) може бути більш простим.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
однак, я хотів би знати, чи є більш елегантний підхід.