2010-01-21 13 views
21

Estoy tratando de grep para una pequeña cadena en una cadena mucho más grande. Ambas cadenas se almacenan como variables y aquí es un ejemplo de código:¿Cómo puedo grep complejos cadenas en variables?

#!/bin/bash 

long_str=$(man man) 
shrt_str="guide" 

if grep -q $shrt_str $long_str ; then 
     echo "Found it!" 
fi 

No creo que la expansión de variables está funcionando como espero que lo haga. He intentado [ ] y [[ ]], también citando las variables y conectando la salida a /dev/null pero no importa lo que haga, no funcionará.

¿Alguien tiene alguna idea?

+0

https://superuser.com/questions/748724/pass-a-large-string-to-grep-instead-of-a-file-name | https://unix.stackexchange.com/questions/163810/grep-on-a-variable –

Respuesta

31
echo "$long_str" | grep -q "$shrt_str" 
if [ $? -eq 0 ];then 
    echo "found" 
fi 

o

echo "$long_str" | grep -q "$shrt_str" && echo "found" || echo "not found" 

Pero dado que está utilizando Bash Shell, luego usa el intérprete de shell. No hay necesidad de llamar a comandos externos

shrt_str="guide" 
case "$long_str" in 
    *"$shrt_str"*) echo "Found";; 
    *) echo "Not found";; 
esac 
+1

Agradable. La declaración de caso anterior debe ser válida en el 'sh' original también. –

+1

sí, debería funcionar en bourne también, si no se confunde. – ghostdog74

+0

Eso es perfecto. Gracias. – Craig

13

grep es para archivos o stdin. Si desea utilizar una variable como entrada estándar a continuación, es necesario utilizar la notación herestring de fiesta:

if grep -q "$shrt_str" <<< "$long_str" ; then 
6

¿Quieres

if echo $long_str | grep -q $shrt_str; then 
5

Otra técnica-Bash específica:

if [[ $long =~ $short ]] # regex match 
then 
    echo "yes" 
fi 

Pero si usted no necesita la larga cadena en una variable:

if man man | grep $short; then ... 

pero yo' Supongo que eso fue solo con el propósito de tener un ejemplo.

+0

Intenté la solución = ~ pero no funcionó. Tampoco la página del manual de prueba incluye el "~" como operador. – Craig

+0

'= ~' no es un operador 'test', es un operador Bash (tenga en cuenta los corchetes dobles). También funciona en ksh y zsh. –

Cuestiones relacionadas