Como “grep” uma string de um resultado retornado

3

Como grep o número 50.0 da string temp=50.0'C

Em JavaScript, posso usar a expressão /temp=(.*?)'C/ para obtê-lo.

Mas não consigo executá-lo no grep.

    
por Chris 16.05.2014 / 23:15

5 respostas

4

Você pode usar lookbehinds e lookaheads depois de ativar o PCRE (via -P ):

root@xxxxxxvlp03 ~ $ echo "temp=50.0'C" | grep -Po "(?<=temp\=).*(?=\'C)"
50.0
root@xxxxxxvlp03 ~ $
    
por 16.05.2014 / 23:36
3

Ou você pode usar sed para extrair um subgrupo correspondente de maneira muito semelhante ao seu exemplo de JavaScript:

echo "temp=50.0'C" | sed "s/temp=\([^']*\)'C//"
    
por 17.05.2014 / 06:59
1

Depende do que você sabe sobre a string. Nesse caso, você poderia definir o resultado desejado como todos os caracteres que são um dígito ou um ponto:

start cmd:> echo "temp=50.0'C" | grep -Eo '[0-9\.]+'
50.0
    
por 16.05.2014 / 23:37
1

Com sed , você pode combinar endereçamento condicional e referências anteriores assim:

sed "/temp=\([0-9.]*\)'C/!d;s//=\n\n/;s/.*=\n//;P;D"

É reconhecidamente pouco mais que uma expansão da resposta da godlygeek, mas escrita com uma entrada de arquivo inteira em mente. Ele imprime somente a seqüência de dígitos e pontos que ocorrem entre as duas strings temp = e 'C - mesmo que múltiplos ocorram na mesma linha - mas cada dígito A sequência é impressa na sua própria linha.

Observe também que, para portabilidade máxima, você deve substituir n em \n\n por novas linhas literais se isso lhe causar algum problema - embora a maioria dos sed possa suportá-lo como por escrito:

...//\
\
/...

De qualquer forma, ele permite que você lide com as coisas malucas da maneira mais portável que eu sei como isso pode ser feito. Como:

sed "/temp=\([0-9.]*\)'C/!d;s//=\n\n/;s/.*=\n//;P;D" <<\DATA
temp=50.0'C
temp=this_is_not_what_you_want'C...temp=92.4'C

some nonsense temp=here
more_nonsensetemp=76.999'Ctemp=56'Ctemp=656'C 
DATA
###OUT###
50.0
92.4
76.999
56
656

Seu mecanismo é bastante simples - exclui linhas que não contêm sua string de destino. Para aqueles que o fazem, seleciona apenas a parte que você deseja manter e a cerca em cada lado com caracteres de nova linha - e coloca um personagem conhecido que não está no seu alvo antes do primeiro. Em seguida, elimina o máximo de espaço padrão possível enquanto ainda termina no separador arbitrário =\n .

Por último, use P rints até a primeira linha nova ocorrendo no espaço padrão - que acabamos de inserir imediatamente atrás de nossa meta - e D eletes mesmo antes de iniciar um novo ciclo com o que resta.

    
por 21.07.2014 / 19:07
0

isso pode parecer útil se você quiser apenas extrair a parte numérica de 50.0'C , você também pode usar cut . pode parecer simples do que usar expressões regulares.

echo "temp=50.0'C" | cut -d= -f2 | cut -d\' -f1

    
por 22.07.2014 / 10:36