Ou, para adicionar ao mix, resolva-o usando awk
: -
awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt
que imprime: -
My name is HIJK
Eu tenho uma linha que vem de um arquivo via:
cat aaa.txt | grep "HIJK"
A saída dá:
HIJK="My name is HIJK"
Eu 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'
Ou, para adicionar ao mix, resolva-o usando awk
: -
awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt
que imprime: -
My name is HIJK
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
sed
com regex básica:
$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"//g'
My name is HIJK
sed
com regex estendido:
$ grep "HIJK" aaa.txt | sed -r 's/.*="(.*)"//g'
My name is HIJK
As aspas duplas não precisam de escape, pois elas 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 de grep
suportar isso:
$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK
Se o seu grep
inicial tiver a garantia de ser o texto antes do =
, você pode reduzir isso para:
$ grep -oP '(?<=HIJK=").*(?=")' aaa.txt
My name is HIJK
Eu resolveria esse problema em duas etapas:
1. Depois que você grep
ed para o padrão, use awk
para remover a parte antes do sinal =:
awk -F = '{print $2}'
2. Em seguida, retire os "sinais com um truque antigo do Unix usando rev
e cut
:
rev | cut --complement -c 1 | rev | cut --complement -c 1
Resumo: Para juntar tudo, você pode usar o seguinte comando para obter a string resultante:
grep "HIJK" filename | awk -F = '{print $2}' | rev | cut --complement -c 1 | rev | cut --complement -c 1
Se você quiser colocar o resultado em uma variável, você pode usar este comando:
VARIABLE="$(grep "HIJK" filename | awk -F = '{print $2}' | rev | cut --complement -c 1 | rev | cut --complement -c 1)"
Isso deve funcionar (somente sed
, no grep
):
VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"//g' aaa.txt)
Conteúdo da variável:
echo $VAR
My name is HIJK
Se o desejo é definir a variável conforme especificado em aaa.txt, você pode simplesmente usar eval.
Por exemplo:
$ grep HJIK aaa.txt
HJIK="My name is HJIK"
$ eval $(grep HJIK aaa.txt)
$ echo $HJIK
My name is HJIK
Algo como:
VAR=$(sed -n '/HIJK=/s/HIJK="\([^"]*\)"//p' aaa.txt)
Não imprima linhas por padrão ( -n
), mas em linhas correspondentes a HJIK=
( /HJIK=/
), substitua HJIK="(something not containing double quotes)"
por (something not containing double quotes)
: s/HIJK="\([^"]*\)"//
e imprima-as - o p
flag.