Estou tendo problemas para obter minha sintaxe sed para adicionar um número variável de zeros à esquerda em um esquema organizacional numérico. As strings que estou operando aparecem como
1.1.1.1,Some Text Here
aproveitando a sintaxe do sed
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
Eu sou capaz de obter a resposta
01.01.01.01,Some Text Here
No entanto, o que estou procurando é algo para preencher até zero de 2 dígitos nos campos 2 e 3 e 3 dígitos no campo 4, para que todos os itens tenham um tamanho padrão de [0-9]. [0- 9] {2}. [0-9] {2}. [0-9] {3}
1.01.01.001,Some Text Here
Para a vida de mim eu não consigo entender nem mesmo como modificar o limite para incluir os parâmetros necessários para encaixar em apenas numerais após um período. Eu acho que tem algo a ver com o uso do \ b que eu entendo combina com zero caracteres em um limite de palavra, mas eu não entendo porque minhas tentativas de adicionar um período para a partida falhar da seguinte forma:
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
Além disso, espero ter problemas adicionais se a instrução contiver texto como:
1.1.1.1,Some Number 1 Here
É uma conclusão precipitada que preciso realmente aprender sed e todas as suas complexidades. Estou trabalhando nisso, mas espero que esta declaração particular continue a me causar problemas por um tempo. Qualquer ajuda seria muito apreciada.
EDIT: Eu descobri uma maneira ... Esta declaração parece fazer o que eu estou procurando, mas tem que haver uma maneira mais elegante para fazer isso.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Além disso, sintaticamente, isso causará problemas se um formato numérico semelhante aparecer no texto ... semelhante a:
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
Nesse caso, isso resultará em:
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
Resolvido
Obrigado a todos pela ajuda aqui. Inicialmente resolvi o problema com a resposta que aceitei abaixo. Eu senti que a solução foi transferida para o Python como parte de uma solução maior, aproveitando o tipo abaixo:
def getPaddedKey(line):
keyparts = line[0].split(".")
keyparts = map(lambda x: x.rjust(5, '0'), keyparts)
return '.'.join(keyparts)
s=sorted(reader, key=getPaddedKey)