[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
*