Como substituir o terceiro caractere em número por outro caractere

2

O parâmetro IPS inclui o endereço IP do diff como:

IPS="192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127"

Eu quero substituir o terceiro "." No número do endereço IP para ","

Como conseguir isso por sed ou awk ?

Exemplo:

echo $IPS | sed ……..

a saída solicitada

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
    
por maihabunash 04.09.2014 / 14:56

7 respostas

3

Apenas no shell:

IPS='192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127'
echo $(IFS=\ .; printf %s.%s.%s,%s\  $IPS)

OUTPUT

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

Mas uma maneira melhor, na qual você pode realmente trabalhar com uma matriz, é transformá-la em uma função:

iprng() (IFS=.;for ip do printf %s.%s.%s,%s\n $ip; done)
iprng $IPS

OUTPUT

192.9.200,12-14
172.17.200,12-89
12.21.1,10-25
127.0.0,1-127

ou ...

echo $(iprng $IPS) 

OUTPUT

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

Como você pode ver, é praticamente a mesma coisa que é feita em outro lugar com awk , exceto que isso é feito de maneira mais simples e sem invocar outro executável.

    
por 04.09.2014 / 19:01
2

Combine tudo até o último ponto e lembre-se em um grupo:

$ echo $IPS | sed 's/\([^ ]*\)\./,/g'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
    
por 04.09.2014 / 15:09
0

Capture o primeiro e o segundo grupos que correspondem aos octetos de um IPaddress e retorne aqueles com o caractere de vírgula no lugar do ponto antes do intervalo:

echo ${IPS}|perl -pe 's!(\d{1,3}\.\d{1,3}\.\d{1,3})\.(\d+-\d+\s+)!$1,$2!g'

Usando o Perl, podemos representar dígitos com \d e espaço em branco com '\ s'.

    
por 04.09.2014 / 15:12
0

GNU awk, defina o separador de registro para um ou mais espaços, o separador de campo para . e assim por diante.

echo "$IPS" | awk -vRS='[ ]+' -F'.' -vOFS='.' '{x=$NF;NF--;printf "%s,%s ", $0,x}'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

Ou

echo "$IPS" | awk -vRS='[ ]+'   '{$0=gensub(/\./, ",", 3); printf "%s%s", $0, RT}'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
    
por 04.09.2014 / 16:40
0

Se você usa perl , você pode:

echo "${IPS}" | perl -pe 's/\./(++$c%3==0)?",":"."/ge'
    
por 04.09.2014 / 15:54
0

Aqui está uma abordagem que faz uso de sed . Ele identifica blocos dentro das sequências que ocorrem assim:

.<digits>-

Quando encontrado, sed lembrará os dígitos & - partes e troca o anterior. com um , .

$ echo "$IPS" | sed 's/\.\([[:digit:]]\+-\)/,/g'

Exemplo

$ echo "$IPS" | sed 's/\.\([[:digit:]]\+-\)/,/g'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
    
por 05.09.2014 / 05:07
0

Você pode usar o comando abaixo perl,

$ echo '192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127' | perl -pe 's/[^.]+\.[^.]+\.[^.]+\K\./,/g'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
    
por 05.09.2014 / 10:34

Tags