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 -x
parámetros porque tengo más números que 329,
en myfile
. Y sin el -x
parámetro, también puedo obtener el Exists
resultado 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 -x
no 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 -F
aquí, 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 -e
nada, 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 -E
para habilitar expresiones regulares extendidas y luego hacer coincidircualquieraa 329
seguido de una coma ( 329,
) o a 329
que 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