substitua string em um arquivo por outro, onde ambos são salvos em variáveis

0

Eu quero substituir uma string encontrada em um arquivo por outra, mas ambos têm um caractere especial (neste exemplo, é um . char), por exemplo, 1.0 e 2.0

então este é o comando atualmente usado:

sed -i 's/1\.0/2\.0/g' /home/user1/file1.txt

e se 1.0 e 2.0 foram salvos nas variáveis $i e $j ? onde i tem o valor 1.0 e j tem o valor 2.0 , como ainda posso substituir i por j ?

EDITAR:

Como sugerido pelo muru, usei as aspas duplas conforme sugerido e funciona bem apenas se $ i e $ j foram salvos como 1.0 e 2.0 eu não funciono corretamente se $ i e $ j forem salvos como 1.0 e 2.0 Alguém por favor, informe como corrigir isso?

EDIT2:

Como sugerido por Muru, segui a resposta encontrada aqui , mas o resultado ainda não está correto.

Este é o meu arquivo de shell:

declare -a arr1=("1.0" "2.0" "3.0" "4.0")
ii=1.0
for i in "${arr1[@]}"
do
    str2=$i
    echo -e "\e[41m## str2 = $str2 ##\e[0m" 
    echo -e "\e[41m## $ii $str2 ##\e[0m"
    printf '%s\n' "$ii" "$str2" |
    file=/home/user1/text1.txt
    tmpfile="${TMPDIR:-/tmp}/$( basename "$file" ).$$"
    while read line
    do
      echo ${line/$ii/$str2}
    done < "$file" > "$tmpfile" && mv "$tmpfile" "$file"

    ii=$str2

done

este é o meu arquivo text1.txt :

0 0 -1 0
1 0 0 0
0 -1 0 0
1.5 0.0 1.0 1

e este é o resultado:

0 0 -4.0
4.0 0 0
0 -4.0 0
1.5 0.0 2.5 1

e o resultado correto deve ser:

0 0 -1 0
1 0 0 0
0 -1 0 0
1.5 0.0 4.0 1
    
por Tak 12.03.2015 / 04:34

2 respostas

2

Use perl no lugar. Ele tem um recurso quotemeta interessante em expressões regulares, onde ele manipula caracteres especiais como . , * , etc como caracteres simples

$ i=1.0  j=4.0
$ perl -pe "s/\Q$i/$j/g" text1.txt 
0 0 -1 0
1 0 0 0
0 -1 0 0
1.5 0.0 4.0 1

Está documentado aqui: link

    
por glenn jackman 12.03.2015 / 11:55
0

Desculpe, eu entendi mal um pouco ... isso:

cobre apenas a string de substituição.

Para correspondência exata na string de pesquisa, eu não acho que sed é sua ferramenta, você quer a resposta que @muru postou também:

Boa sorte

    
por dpb 12.03.2015 / 05:07