br comando retornando “sed: opção ruim na expressão de substituição”

0

Por exemplo: - Eu tenho um arquivo chamado file.txt

$ cat file.txt
$key

Eu tenho uma variável de ambiente, por exemplo: $ key em um arquivo de texto

e vamos dizer $ key = 1234, então eu posso substituir o valor com o comando abaixo

sed -i 's/$key/'"$key"'/' file.txt 

e se torna

$ cat file.txt
1234

Meu problema é que, se o valor para

$key = 1/2/3/4

Eu não consigo executar o comando abaixo

sed -i 's/$key/'"$key"'/' file.txt  

Isso dará um erro

sed: bad option in substitution expression

Por causa da barra está quebrando. Eu posso resolvê-lo dando o valor diretamente, mas não quero usá-lo dessa maneira.

sed -i 's/$key/1\/2\/3\/4/' file.txt 
    
por Vishnu Nair 18.12.2015 / 15:41

2 respostas

5

O problema tem a ver com o fato de que o sed delimitador é / e colide com o texto em $key . Para resolvê-lo, use outro delimitador. Por exemplo, # :

$ key="1/2/3/4"
$ echo 1/2/3/4 | sed "s#$key#\"$key\"#" 
"1/2/3/4"

Ou

$ echo "hello this is 1/2/3/4 yeah" | sed "s#$key#\"$key\"#"
hello this is "1/2/3/4" yeah

Leitura interessante: Que delimitadores você pode usar em sed? . Spoiler: quase tudo!

    
por 18.12.2015 / 15:57
1

Perl para o resgate:

perl -pe 's/\$([[:alnum:]]+)/$ENV{$1}/'

Explicação:

  • \$ corresponde ao cifrão.
  • [[:alnum:]] corresponde a dígitos, letras e sublinhados, ou seja, caracteres identificadores válidos. O + significa que deve haver pelo menos um desses caracteres.
  • (...) apresenta um grupo de captura.
  • $ENV{$1} recupera o valor do %ENV hash que contém as variáveis de ambiente. Perl não expande variáveis como shell, então a variável pode conter / (ou qualquer outra coisa) sem danos.

Exemplo:

$ echo '$key' | key=1/2/3/4 perl -pe 's/\$([[:alnum:]]*)/$ENV{$1}/'
1/2/3/4
    
por 18.12.2015 / 15:52