Substituição de string com "/ " com Sed dando erro [RESOLVIDO]

1. Substituição de string com "/ " com Sed dando erro [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 13/05/2013 - 11:32h

Olá pessoal,

estou tendo um problema de substituição com o Sed
Tenho a seguinte variável que mostra a data e hora:
DATAHORA="`date "+%d/%m/%y - %H:%M:%S"`"

Eu preciso substituir uma string (%%DATAHORA) pelo resultado desta variável, acontece que sempre da erro no Sed por causa do separador que usei na data (/)
$- echo "tal tal tal %%DATAHORA" | sed "s/%%DATAHORA/$DATAHORA/"
$- sed: bad option in substitution expression

já tentei colocar a variável entre aspas, usar um echo dentro do sed, usar comando entre '' dentro do sed ao invés da variável, mas nada da certo!
Ps.: Se eu usar outro separador na data que não seja barra dá certo, mas o separador tem que ser este.

Alguém tem alguma sugestão??

Grato!


  


2. MELHOR RESPOSTA

Fernando
phoemur

(usa Debian)

Enviado em 13/05/2013 - 15:49h

Você pode criar uma variável data e hora escapada pra usar só dentro do sed:

DATAHORA="`date "+%d/%m/%y - %H:%M:%S"`"


DATASED=$(date "+%d/%m/%y - %H:%M:%S" | sed 's/\//\\\//g')

ou então DATASED=$(echo $DATAHORA | sed 's/\//\\\//g')



daí:

echo "bla bla bla %%DATAHORA" | sed "s/%%DATAHORA/$DATASED/"


Assim aqui funcionou...

3. Re: Substituição de string com "/ " com Sed dando erro [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 13/05/2013 - 15:24h

Sempre que você for usar caracteres especiais dentro do SED você deve escapar, ou seja, colocar precedido por uma barra invertida.

por exemplo se você colocar um ponto ( . ) , ele vai entender que é um caracter de expressão regular que pode ser qualquer caractere. Se você quiser dizer a representacao literal do ponto você tem que usar assim: Ou usa escapando: \.
Ou assim: [.]

A barra ( / ) também é um caractere especial e você deve escapar/
por exemplo, subsituindo /dev/sda1 por /dev/sdb1:

sed 's/\/dev\/sda1/\/dev\/sdb1/'

Quanto ao seu caso, não seria mais fácil primeiro cortar a string que você não quer e depois acrescentar a data no formato certo no fim?

tipo assim:


DATAHORA="`date "+%d/%m/%y - %H:%M:%S"`"

echo -n "bla bla bla %%DATAHORA" | sed "s/\(bla.bla.bla\).*/\1/;a$DATAHORA" | tr '\n' ' '


certamente deve existir uma solução mais eficiente, substituindo o tr por mais um comando do SED, mas eu fiz isso aqui em 30 segundos...




4. Re: Substituição de string com "/ " com Sed dando erro [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 13/05/2013 - 15:39h

Ola phoemur,

assim como você propôs não adianta pois o sed não está substituindo a string %%DATAHORA e sim apaga o que estiver depois do "bla bla bla" e joga o resultado da variável
só peguei uma parte do script que preciso corrigir isto e resumi com esse echo blablabla, só que na verdade a mensagem não é estática, e o %%DATAHORA pode estar no meio da frase por exemplo

Eu sabia desta de ter que escapar estes caracteres, mas não consegui pois eles estavam dentro da variável $DATAHORA, mas seguindo sua linha de raciocínio consegui fazer funcionar mais ou menos(só não consegui entender os parâmetros!):
$- echo -n "bla bla bla %%DATAHORA" | sed "s/%%DATAHORA//;a$DATAHORA"
bla bla bla 13/05/13 - 15:25:54 (OK!)

só que, se:
$- echo -n "antes da variavel %%DATAHORA depois da variavel" | sed "s/%%DATAHORA//;a$DATAHORA"
antes da variavel depois da variavel13/05/13 - 15:25:54

Então é quase isto!
tem mais alguma ideia?

Obrigado!


5. Re: Substituição de string com "/ " com Sed dando erro [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 13/05/2013 - 15:52h

Veja:

phoemur@darkstar:~$ DATASED=$(date "+%d/%m/%y - %H:%M:%S" | sed 's/\//\\\//g')
phoemur@darkstar:~$ echo $DATASED
13\/05\/13 - 15:50:59
phoemur@darkstar:~$ echo "bla bla bla %%DATAHORA" | sed "s/%%DATAHORA/$DATASED/"
bla bla bla 13/05/13 - 15:50:59 (OK)
phoemur@darkstar:~$ echo "bla bla bla %%DATAHORA bla bla bla" | sed "s/%%DATAHORA/$DATASED/"
bla bla bla 13/05/13 - 15:50:59 bla bla bla (OK)



6. Re: Substituição de string com "/ " com Sed dando erro [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 13/05/2013 - 15:56h

ah isso aí!
esta variável é pra usar somente no próximo comando com o sed, então crio somente a variável DATASED mesmo

matou a pau, muito obrigado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts