sed no bash não funciona

3

Eu estou tentando usar o editor de fluxo sed no bash para substituir uma string em um arquivo para uma nova string que eu digitei, eu tenho isso até agora:

echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i 's/$updatenaamold/$updatenaamnew/g' $naam_dir
echo "name changed"

Isso deve funcionar! Mas, de alguma forma, no arquivo que eu quero editar existe um nome chamado "bryan" que eu quero editar para "bryan name". Coloquei o nome antigo em uma variável que preciso inserir obviamente e o novo nome em uma variável também. Alguém pode me dizer por que não funciona?

    
por bryan 03.06.2011 / 15:09

2 respostas

6

Use apenas aspas duplas em vez de aspas simples. (Aspas simples não permitem expansão de variáveis).

echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i "s/$updatenaamold/$updatenaamnew/g" $naam_dir
echo "name changed"

Nota 1: Se $naam_dir for um diretório, também não funcionará. Afaik sed funciona em uma base arquivo por arquivo.

Nota 2: Se o usuário inserir caracteres especiais (como: / ^ $ [] ), as coisas não funcionarão como esperado, porque isso irá confundir o sed. Solução alternativa (não tenho certeza se esse seria o melhor caminho):

updatenaamold=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamold" | sed 's/[^a-zA-Z0-9]//g' )
updatenaamnew=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamnew" | sed 's/[^a-zA-Z0-9]//g' )

Adicione antes do sed. Ele irá remover caracteres que não sejam letras e números (sem espaços, sem caracteres internacionais, etc). Outra abordagem seria abortar quando encontrado caracteres estranhos (e evitar erros acidentais).

    
por 03.06.2011 / 15:18
1

Como você está usando bash , sugiro usar o check-out de manipulações de string bash .

    
por 03.06.2011 / 18:34

Tags