O padrão captura (1) o início da linha ou algo que não é um dígito nem um ponto, seguido por (2) qualquer número de dígitos, pelo menos um, seguido por (3) exatamente três dígitos. Em seguida, os coloca de volta com uma vírgula entre (2) e (3), com efeito adicionando um separador de milhar. O primeiro grupo é necessário apenas para evitar tocar em partes fracionárias após um ponto decimal, pois não queremos 1.2345
nos transformar em 1.2,345
.
Observe que o padrão é escrito em expressões regulares básicas (BRE), exigindo barras invertidas na frente de cada uma ()
e {}
para torná-las especiais. Além disso, requer GNU sed, onde \+
e \|
também tem significados especiais no BRE como uma extensão . O comando seria melhor escrito como uma expressão regular estendida ( sed -E
é suportada por muitas implementações sed):
sed -E 's/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g'
Além disso, o padrão faz apenas uma substituição, não inclui vários milhares de separadores no mesmo número. O /g
final corresponderá várias vezes na mesma linha, mas ainda não processa os dados substituídos. 1234567
vai se tornar 1234,567
, não 1,234,567
. Para corrigir isso, precisamos adicionar um loop:
sed -E -e :a -e 's/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g' -e ta
Aqui, :a
é apenas um rótulo, e as finais ta
t ests para uma substituição bem-sucedida, e salta de volta para a
se um substituto foi feito, na verdade repetindo o processo tantas vezes quanto ele faz algo. Daí 1234567
vai se transformar 1,234,567
.