shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Dúvida com sed


From: Paulo Bettega
Subject: Re: [shell-script] Dúvida com sed
Date: Wed, 26 Mar 2014 01:32:29 -0300
User-agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.3.0

Olá Bezaleel , as chaves [0-9]{3} indicam exatos três números seguidos,
vai casar de 001 até 999.
Então o sed substitui três números seguidos, de 100 até 999.

sed -r 's/[0-9]{3}/teste/' <<<'Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0'

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         teste.168.1.1     0.0.0.0         UG    0      0        0 wlan0
teste.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

Substituiu a primeira ocorrência de cada linha,
para substituir todas as ocorrências use g de global
sed -r 's/[0-9]{3}/teste/g'
ou a segunda ocorrência
sed -r 's/[0-9]{3}/teste/2'


Esse sed "sed -r 's-^([0-9]{3}).([0-9]{3}).([0-9]{3}).([0-9]{3})$-/teste-'"
não deu certo porque a expressão vai tentar casar um ip 192.168.001.000
que esteja sozinho na linha, pois vc ancorou no início da linha ^ e no fim da 
linha $

Poderia ter casado o ip 192.168.100.100, mas ia falhar por causa da
âncora de fim de linha $.

Além disso vc mudou o separador de s/// para s---(sem problema quanto a isso,
dependendo do caso), e o ponto deve ser escapado pois é literal.



[0-9]{1,3} indica de um a três números seguidos, vai casar 
0,1,2,...,10,...,99,100,...,999
ou também 00,01,... e 000,001,...

tem que escapar o ponto, pois é literal
sed -r 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/teste/' <<<'Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0'

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
teste         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
teste     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

de novo só substituiu a primeira ocorrência, com g substitui todas
sed -r 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/teste/g' <<<'Kernel IP 
routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0'

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
teste         teste     teste         UG    0      0        0 wlan0
teste     teste         teste   U     0      0        0 wlan0


Teve uma discussão uns dias atrás na lista sobre casamento de ip, vale a pena
dar uma olhada. Espero ter ajudado e não ter passado nada errado.

Abraços Paulo Bettega


On 26-03-2014 00:16, Bezaleel Ramos wrote:
Galera,

Não estou desenvolvendo script nada, só queria tirar uma dúvida com o sed.

Cenário:

Criei um arquivo onde peguei a saida do comando route -n e armazenei neste 
arquivo.

Quando eu uso o sed para substituir as primeiras cadeia de três números que vai 
[0-9]:

$sed -r 's/([0-9]{3})/teste/' route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         teste.168.1.1     0.0.0.0         UG    0      0        0 wlan0
teste.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

Ele substitui mas quando uso:

$sed -r 's-^([0-9]{3}).([0-9]{3}).([0-9]{3}).([0-9]{3})$-/teste-' route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

Como vocês  pode vê ele não substitui.

Pesquisei no fórum algo relacionado o mais próximo que peguei foi do Julio,  e 
tentei algo como:

$  sed -r 's|([0-9]{3}).([0-9]{3}).([0-9]{3}).([0-9]{3})|\teste|' route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

Alguém sabe como tenho que organizar esta expressão para da certo?

Vlw




--
*
*
*
*
*
*
*Bezaleel Ramos da Silva*
*Tel. (21) 7996-1531
*


reply via email to

[Prev in Thread] Current Thread [Next in Thread]