sed: problema ao substituir string usando curinga

2

Estou tentando substituir uma string usando o seguinte comando:

sed -e "s/\<$5\>/$6/g" "$2/$1" > "$4/$3"

$5-> "hostname=*"
$6-> "hostname=int1"
$2/$1-> "source file path"
$4/$3-> "destination file path" 

Quando tento substituir o seguinte:

hostname=abc

Eu recebo

hostname=int1=abc

Mas eu quero,

hostname=int1

Como posso corresponder uma string para conseguir isso?

    
por Menon 07.05.2015 / 09:06

2 respostas

4

sed usa expressões regulares. Estes são diferentes dos padrões ("globs") que o shell usa.

Observe que o seguinte não funciona:

$ echo hostname=abc | sed "s/\<hostname=*\>/hostname=int1/"
hostname=int1=abc

Mas o seguinte faz:

$ echo hostname=abc | sed "s/\<hostname=.*\>/hostname=int1/"
hostname=int1

Você precisa de um . antes do * .

Como uma expressão regular , hostname=* significa hostname seguido por zero ou mais sinais de igual. Assim, sed "s/\<hostname=*\>/hostname=int1/" substitui hostname por hostname=int1 .

Por outro lado, a expressão regular hostname=.* significa hostname= seguida de zero ou mais qualquer caractere. É por isso que s/\<hostname=.*\>/hostname=int1/ substitui hostname=abc por hostname=int1 .

    
por 07.05.2015 / 09:15
1

Pode haver uma solução melhor do que isso, mas você pode usar o comando abaixo.

sed /hostname.*$/s//"hostname=int1"/g /home/path/of/your/original/file > /tmp/hello.$$

cat /tmp/hello.$$ > /home/path/of/your/original/file

Espero que ajude.

    
por 07.05.2015 / 09:27