Atualmente estou escrevendo um script bash que deve verificar se a string exata 329,
existe em myfile
. Pesquisei na web e encontrei algumas respostas, mas não consigo usar -x
parâmetros porque tenho mais números do que 329,
em myfile
. E sem o -x
parâmetro também posso obter o Exists
resultado 329
, o que não quero.
Tentei;
if grep -xqFe "329," "myfile"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
E o resultado foi;
Not Exists
Dentro de myfile
;
329, 2, 57
Como posso resolver isso?
Responder1
O -x
não é relevante aqui. Isso 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 $.
Portanto, só é útil se você quiser encontrar linhas que não contenham nada além da string exata que você está procurando. A opção que você deseja é -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.
Isso corresponderá se você encontrar sua string de destino como uma "palavra" independente, como uma string cercada por caracteres "não-palavras". Você também não precisa do -F
aqui, isso só é útil se o seu padrão contiver caracteres com significados especiais em expressões regulares que você deseja encontrar literalmente (por exemplo *
), e você não precisa -e
de nada, isso seria necessário se você quisesse para dar mais de um padrão. Então você está procurando:
if grep -wq "329," myfile; then
echo "Exists"
else
echo "Does not exist"
fi
Se você também quiser combinar quando o número é o último na linha, então não tem ,
depois dele, você pode usar grep -E
para habilitar expressões regulares estendidas e então combinarqualquera 329
seguido de vírgula ( 329,
) ou a 329
que esteja no final da linha ( 329$
). Você pode combiná-los assim:
if grep -Ewq "329(,|$)" myfile; then
echo "Exists"
else
echo "Does not exist"
fi
Responder2
Outra alternativa pode ser:
if cat myfile | tr "," "\n" | grep -xqF "329"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
Cumprimentos