El valor de col1
es la cadena de 13 caracteres ma${token}jid
. Cuando escribe echo ${col1}
sin comillas, el shell reemplaza ${col1}
por el valor de la variable, luego realiza la división de palabras (es decir, divide el valor en palabras separadas en $IFS
caracteres) y la generación de nombre de archivo (es decir, globalización). Los valores variables no se expanden recursivamente utilizando la sintaxis de shell. Si usa comillas dobles alrededor de la sustitución de variables (que debe hacer a menos que tenga una buena razón para no hacerlo), se "$col1"
expande directamente al valor de col1
.
Si sus cadenas son lo suficientemente mansas (es decir, no contienen caracteres especiales de shell, aparte del ${token}
que desea sustituir), puede construir una cadena a partir de la $col1
que evalúa como un fragmento de shell. En su ejemplo, se imprimirá la siguiente línea ma12345678jid
:
eval "echo $col1"
Alternativamente, reemplace el marcador ${token}
por el valor deseado. Puedes hacerlo con una sustitución de cadena en bash:
while read -r col1 col2 col3; do
echo "${col1//'${token}'/$token}"
echo "${col2}"
echo "${col3}"
echo "********************************"
done <input.txt
También puede hacerlo awk
, como un paso previo o posterior al procesamiento (dependiendo de si desea realizar el reemplazo también en otras columnas).
<input.txt awk -v repl="$token" '{gsub(/\${token}/, repl); print}' |
while read …
Puede realizar el reemplazo con sed
, pero solo si está seguro de que ninguno de los caracteres &\/
y la nueva línea aparecen en el texto de reemplazo $token
(puede cambiar el carácter separador de /
a otra cosa si hay otro carácter que está seguro de que no aparece en $token
).
<input.txt sed -e "s/\\\${token}/$token/" |
while read …