Soy un novato relativo de Linux. Supongamos que tengo un archivo de texto a.txt
que contiene el siguiente texto:
A
B
C
Ahora, si quiero cambiar el texto en la línea 2 (que contiene B
), puedo usar el siguiente sed
comando:
sed -i '2s/^.*$/X/' a.txt
para cambiar la B
a X
, por ejemplo.
Pero ahora supongamos que quiero escribir un sed
comando que cambia el texto en la línea 2 a algo que incluye una variable de cadena bash. Quiero cambiar el texto de la línea 2 a fname="myaddress"
, donde las comillas se incluyen explícitamente y myaddress
es una variable de cadena bash (definido en otro lugar). Para intentar hacer esto, he creado un script de shell bash llamado mytest.sh
y que contiene lo siguiente:
#!/bin/bash
myaddress="/home/"
echo fname="$myaddress"
head a.txt
sed -i '2s/^.*$/fname="$myaddress"/' a.txt
head a.txt
Ahora, echo fname="$myaddress"
imprime fname="/home/"
, que es el texto que quiero estar en la línea 2 de a.txt
. Sin embargo, sed
en su lugar, imprime fname="$myaddress"
a la línea 2 de a.txt
, probablemente porque está dentro de los apóstrofes circundantes. En otras palabras, la salida del script bash shell anterior es:
fname="/home/"
A
B
C
A
fname="$myaddress"
C
Mi pregunta es, ¿cómo puedo obtener sed
? para imprimir realmente el valor almacenado en myaddress
y referenciado por $myaddress
?
Respuesta aceptada:
Hay dos problemas:primero, como ya señaló Kevin, las variables de shell deben estar entre comillas dobles si van a ser expandidas por el shell. En segundo lugar, su cadena de reemplazo contiene un /
, por lo que no puede usar /
al mismo tiempo como delimitador para sed
. Si conoce algún carácter, diga ,
, definitivamente no aparecerá en la cadena de reemplazo, podría usar ese carácter como sed
delimitador, por lo que obtienes
sed -i '2s,^.*$,fname="'"$myaddress"'",' a.txt