У меня возникают проблемы со снижением синтаксиса 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 цифр в полях 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
Это предрешенный вывод, что мне нужно по-настоящему изучить sed и все его сложности. Я работаю над этим, но ожидаю, что это конкретное заявление будет еще некоторое время доставлять мне неприятности. Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ: Я нашел способ ... Это утверждение, кажется, делает то, что я ищу, но должен быть более элегантный способ сделать это.
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/.//'
однако, я хотел бы знать, есть ли более элегантный подход.