
¿Cómo reemplazo Old_String con New_String en un archivo?
Cadena_antigua:
$resultado = $cliente->updateInventory("UpdateInventory.xml");Nueva_cadena:
$resultado = $cliente->updateInventory("/Desktop/new/UpdateInventory.xml");
Old_String en el número de línea = 5 en un archivo llamado file1.txt
Lo que probé:
sed '5s/.*/'$resultado = $cliente->updateInventory("/Desktop/new/UpdateInventory.xml");'/' file1.txt
Respuesta1
Puede utilizar el siguiente comando para lograr lo mismo
sed "5s:.*:'$'result = '$'client->updateInventory('/Desktop/new/UpdateInventory.xml');:g" filename | sed "s:'$':$:g" | tr "'" '"'
Respuesta2
Elimine las comillas simples internas. Terminan con los externos, por lo que $result
se expandirán y sed
probablemente se quejarán de un s
comando inacabado.
En su lugar, utilice un delimitador diferente para el s
comando; puede utilizar casi cualquier cosa en lugar de la barra diagonal. Entonces
sed '5s_.*_$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml");_' file1.txt
es lo que quieres.
Respuesta3
Otra forma es utilizar c
el comando que borra las líneas especificadas por la dirección.
$ seq 5 | sed '2c\
foobar'
1
foobar
3
4
5
$ # with GNU-sed, assuming \ is not first character
$ seq 5 | sed '2cfoobar'
Ambos comandos s
y c
tendrán problemas si la cadena de reemplazo tiene ciertos caracteres especiales, por ejemplo:
$ seq 3 | sed '2s/.*/abc&xyz/'
1
abc2xyz
3
$ seq 3 | sed '2cabc\tabc'
1
abc abc
3
Una forma sólida de manejar esto es usar r
el comando
$ echo 'foo&\t\n\1///\\xyz' > f1
$ seq 3 | sed -e '2rf1' -e '2d'
1
foo&\t\n\1///\\xyz
3
Respuesta4
Usando el comando awk también podemos lograr el resultado.
awk ‘NR==5 {gsub(".*","$result = $client->updateInventory(/Desktop/new/UpdateInventory.xml);",$0);print $0}' filename| sed 's/(/&"/g' | sed 's/)/"&/g'