Cómo "grep" una cadena de un resultado devuelto

Cómo grep el número 50.0 de la cadena temp=50.0'C

En JavaScript, puedo usar la expresión /temp=(.*?)'C/ para getla.

Pero no puedo ejecutarlo en grep.

Puede usar lookbehinds y lookaheads después de habilitar PCRE (via -P ):

 root@xxxxxxvlp03 ~ $ echo "temp=50.0'C" | grep -Po "(?<=temp\=).*(?=\'C)" 50.0 root@xxxxxxvlp03 ~ $ 

O puede usar sed para extraer un subgrupo coincidente de una manera bastante similar a su ejemplo de JavaScript:

 echo "temp=50.0'C" | sed "s/temp=\([^']*\)'C/\1/" 

Depende de lo que sabes sobre la cadena. En este caso, podría definir el resultado deseado como todos los caracteres que son un dígito o un punto:

 start cmd:> echo "temp=50.0'C" | grep -Eo '[0-9\.]+' 50.0 

Con sed puedes combinar el direccionamiento condicional y las references posteriores de esta manera:

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

Es cierto que es poco más que una expansión de la respuesta de Godlygeek, pero escrita con una input de file completa en mente. Imprime solo la secuencia de dígitos y .dots que se producen entre las dos cadenas temp = y 'C – incluso si se producen múltiples en la misma línea – pero cada secuencia de dígitos | puntos se imprime en su propia línea.

También tenga en count que para una portabilidad máxima debe replace las n en \n\1\n con nuevas líneas literales si le da algún problema, aunque la mayoría de los sed lo admitirán como está escrito, como:

 ...//\ \1\ /... 

De todos modos, te permite manejar las cosas locas tan fácilmente como sé cómo se puede hacer. Me gusta:

 sed "/temp=\([0-9.]*\)'C/!d;s//=\n\1\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 

Su mecanismo es bastante simple: elimina las líneas que no contienen la cadena objective. Para aquellos que lo hacen, selecciona solo la parte que deseas conservar y la rodea de cada lado con caracteres de nueva línea, y coloca un personaje que no está en tu objective antes del primero. A continuación, elimina la mayor cantidad de espacio de patrones posible mientras continúa en el separador arbitrario =\n .

Last it Imprime solo hasta la primera nueva línea que aparece en el espacio del patrón, que acabamos de insert inmediatamente detrás de nuestro objective, y D elige antes de comenzar un nuevo ciclo con lo que queda.

Esto puede parecer útil si solo desea extraer la parte 50.0'C de 50.0'C , también puede usar cut . puede parecer simple que usar expresiones regulares.

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