Obtenha texto entre dois caracteres especiais em uma linha usando shell

Obtenha texto entre dois caracteres especiais em uma linha usando shell

Eu tenho uma linha que vem de um arquivo via:

cat aaa.txt | grep "HIJK"

A saída fornece:

HIJK="My name is HIJK"

Preciso colocar o texto My name is HIJKem uma variável em um script de shell.

Eu tentei isso, mas não funciona:

cat aaa.txt | grep "HIJK" | sed -n '/\"/,/\"/p'

Responder1

Ou, para adicionar à mistura, resolva usando awk: -

awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt

que imprime: -

My name is HIJK

Responder2

use IFSpara isso

$ 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

Responder3

sedcom regex básico:

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

sedcom regex estendido:

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

As aspas duplas não precisam de escape, pois já estão entre aspas simples (e, portanto, serão tratadas como literais, pois não são especiais).

Você também pode usar grep -oPse sua versão grepsuportar isso:

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

Se for garantido que sua inicial grepseja o texto antes de =, você poderá reduzir para:

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

Responder4

Isso deve funcionar (apenas sed, não grep):

VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"/\1/g' aaa.txt)

Conteúdo da variável:

echo $VAR
My name is HIJK

informação relacionada