¿Cómo puedo comprobar si existe una cadena en el archivo?

¿Cómo puedo comprobar si existe una cadena en el archivo?

Actualmente estoy escribiendo un script bash que debería verificar si la cadena exacta 329,existe en myfile. Busqué en la web y encontré algunas respuestas, pero no puedo usar -xparámetros porque tengo más números que 329,en myfile. Y sin el -xparámetro, también puedo obtener el Existsresultado 329, que no quiero.

Lo intenté;

if grep -xqFe "329," "myfile"; then
    echo -e "Exists"
else
    echo -e "Not Exists"
fi

Y el resultado fue;

Not Exists

Dentro de myfile;

329, 2, 57

¿Como puedo resolver esto?

Respuesta1

El -xno es relevante aquí. Eso significa (de man grep):

-x, --line-regexp
       Select  only  those  matches that exactly match the whole line.
       For a regular expression pattern, this is  like  parenthesizing
       the pattern and then surrounding it with ^ and $.

Por lo tanto, sólo es útil si desea encontrar líneas que no contengan nada más que la cadena exacta que está buscando. La opción que quieres es -w:

-w, --word-regexp
       Select  only  those  lines  containing  matches that form whole
       words.  The test is that the matching substring must either  be
       at  the  beginning  of  the  line,  or  preceded  by a non-word
       constituent character.  Similarly, it must be either at the end
       of  the  line  or followed by a non-word constituent character.
       Word-constituent  characters  are  letters,  digits,  and   the
       underscore.  This option has no effect if -x is also specified.

Eso coincidirá si encuentra la cadena de destino como una "palabra" independiente, como una cadena rodeada de caracteres "que no son palabras". Tampoco necesita -Faquí, eso solo es útil si su patrón contiene caracteres con significados especiales en expresiones regulares que desea encontrar literalmente (por ejemplo *), y no necesita -enada, sería necesario si quisiera. para dar más de un patrón. Entonces estás buscando:

if grep -wq "329," myfile; then 
    echo "Exists" 
else 
    echo "Does not exist"
fi

Si también desea hacer coincidir cuando el número es el último en la línea, por lo que no tiene ,después, puede usar grep -Epara habilitar expresiones regulares extendidas y luego hacer coincidircualquieraa 329seguido de una coma ( 329,) o a 329que está al final de la línea ( 329$). Puedes combinarlos así:

if grep -Ewq "329(,|$)" myfile; then 
    echo "Exists" 
else 
    echo "Does not exist"
fi

Respuesta2

Otra alternativa podría ser:

if cat myfile | tr "," "\n" | grep -xqF "329"; then
    echo -e "Exists"
else
    echo -e "Not Exists"
fi

Saludos

información relacionada