Obtener texto entre dos caracteres especiales en una línea usando Shell

Obtener texto entre dos caracteres especiales en una línea usando Shell

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 HIJKen 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 IFSpara 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

sedcon expresiones regulares básicas:

$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"/\1/g'
My name is HIJK

sedcon 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 -oPsi tu versión grepadmite esto:

$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK

Si se garantiza que su inicial grepserá 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

información relacionada