
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 HIJK
em 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 IFS
para 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
sed
com regex básico:
$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"/\1/g'
My name is HIJK
sed
com 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 -oP
se sua versão grep
suportar isso:
$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK
Se for garantido que sua inicial grep
seja 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