GNU/Linux >> Tutoriales Linux >  >> Linux

¿Usando una referencia a una variable de cadena Bash en Sed?

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

Linux
  1. ¿Envolver el primer carácter de una cadena usando Sed?

  2. ¿Reemplazo de cadenas usando un diccionario?

  3. Usando grep y sed para encontrar y reemplazar una cadena

  4. Elimine los espacios en blanco en cada comienzo de línea del archivo, usando bash

  5. Usando sed para dividir una cadena con un delimitador

Variable de exportación de bash

Bash concatenar cadenas

Sustitución de cadena en Bash

Bash Scripting – Manipulación de cadenas

Bash Beginner Series #4:Uso de arreglos en Bash

Uso del comando Bash printf para imprimir salidas formateadas