Obtém texto entre dois caracteres especiais em uma linha usando shell

1

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'
    
por A Pophali 25.06.2014 / 15:31

7 respostas

1

Ou, para adicionar ao mix, resolva-o usando awk : -

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

que imprime: -

My name is HIJK
    
por 25.06.2014 / 15:59
1

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
    
por 25.06.2014 / 15:42
0

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
    
por 25.06.2014 / 15:44
0

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)"
    
por 25.06.2014 / 15:53
0

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
    
por 25.06.2014 / 15:57
0

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
    
por 25.06.2014 / 16:27
0

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.

    
por 25.06.2014 / 16:58