
Tengo una línea que proviene de un archivo vía:
cat aaa.txt | grep "HIJK"
La salida da:
HIJK="My name is HIJK"
Necesito convertir el texto My name is HIJK
en una variable en un script de shell.
He probado esto, pero no funciona:
cat aaa.txt | grep "HIJK" | sed -n '/\"/,/\"/p'
Respuesta1
O, para agregar a la mezcla, resuélvelo usando awk
:-
awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt
que imprime: -
My name is HIJK
Respuesta2
utilizar IFS
para esto
$ IFS=\= read var1 var2 <<< $(grep "HIJK" aaa.txt)
$ echo $var1
HIJK
$ echo $var2
"My name is HIJK"
$ var2="${var2%\"}" // remove double quotes on both sides
$ var2="${var2#\"}"
$ echo $var2
My name is HIJK
Respuesta3
sed
con expresiones regulares básicas:
$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"/\1/g'
My name is HIJK
sed
con expresión regular extendida:
$ grep "HIJK" aaa.txt | sed -r 's/.*="(.*)"/\1/g'
My name is HIJK
Las comillas dobles no necesitan escape, ya que ya están dentro de comillas simples (y por lo tanto serán tratadas como literales, ya que no son especiales).
También puedes usar grep -oP
si tu versión grep
admite esto:
$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK
Si se garantiza que su inicial grep
será el texto antes de =
, puede reducirlo a:
$ grep -oP '(?<=HIJK=").*(?=")' aaa.txt
My name is HIJK
Respuesta4
Esto debería funcionar (solo sed
, no grep
):
VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"/\1/g' aaa.txt)
Contenido de la variable:
echo $VAR
My name is HIJK