Com a ajuda do número da linha, substitua uma linha inteira por outra linha que contenha o caminho do arquivo

1

Como substituo Old_String por New_String em um arquivo?

Old_String:

 $result = $client->updateInventory("UpdateInventory.xml"); 
New_String:
 $result = $client->updateInventory("/Desktop/new/UpdateInventory.xml"); 

Old_String na linha number = 5 em um arquivo chamado file1.txt

O que eu tentei:

sed '5s/.*/'$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml");'/' file1.txt
    
por Dipankar Nalui 01.12.2017 / 09:17

4 respostas

2

Você pode usar o comando abaixo para obter o mesmo

sed "5s:.*:'$'result = '$'client->updateInventory('/Desktop/new/UpdateInventory.xml');:g" filename | sed "s:'$':$:g" | tr "'" '"'
    
por 01.12.2017 / 10:11
0

Remova as aspas simples internas. Eles terminam os externos, então $result será expandido e sed provavelmente se queixará de um comando s inacabado.

Em vez disso, use um delimitador diferente para o comando s , você pode usar quase qualquer coisa em vez da barra. Então

sed '5s_.*_$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml")‌​;_' file1.txt

é o que você quer.

    
por 01.12.2017 / 09:54
0

Outra maneira é usar o comando c , que limpa a (s) linha (s) especificada (s) pelo endereço

$ seq 5 | sed '2c\
foobar'
1
foobar
3
4
5

$ # with GNU-sed, assuming \ is not first character
$ seq 5 | sed '2cfoobar'

Os comandos s e c terão problemas se a sequência de substituição tiver determinados caracteres especiais, por exemplo:

$ seq 3 | sed '2s/.*/abc&xyz/'
1
abc2xyz
3
$ seq 3 | sed '2cabc\tabc'
1
abc     abc
3

Uma maneira robusta de lidar com isso é usar o comando r

$ echo 'foo&\t\n///\xyz' > f1
$ seq 3 | sed -e '2rf1' -e '2d'
1
foo&\t\n///\xyz
3
    
por 01.12.2017 / 10:11
0

Usando o comando awk também podemos alcançar o resultado

awk  ‘NR==5 {gsub(".*","$result = $client->updateInventory(/Desktop/new/UpdateInventory.xml);",$0);print $0}' filename| sed 's/(/&"/g' | sed 's/)/"&/g'
por 01.12.2017 / 10:39