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 ~ $
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.
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 ~ $
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//"
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
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
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.
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
Tags grep regular-expression