В настоящее время я пишу скрипт bash, который должен проверять, существует ли точная строка 329,
в myfile
. Я поискал в Интернете и нашел несколько ответов, но я не могу использовать -x
параметры, потому что у меня больше чисел, чем 329,
в myfile
. И без -x
параметра я могу получить Exists
результат с 329
too, что мне не нужно.
Я пытался;
if grep -xqFe "329," "myfile"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
И на выходе получилось:
Not Exists
Внутри myfile
;
329, 2, 57
Как мне решить эту проблему?
решение1
Здесь это -x
не имеет значения. Это означает (из 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 $.
Так что это полезно только если вы хотите найти строки, которые не содержат ничего, кроме точной строки, которую вы ищете. Вам нужна опция -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.
Это будет соответствовать, если вы найдете вашу целевую строку как отдельное "слово", как строку, окруженную символами "не-слово". Вам также не нужно здесь -F
, это полезно только если ваш шаблон содержит символы со специальным значением в регулярных выражениях, которые вы хотите найти буквально (например, *
), и вам вообще не нужно -e
, это было бы необходимо, если бы вы хотели задать более одного шаблона. Итак, вы ищете:
if grep -wq "329," myfile; then
echo "Exists"
else
echo "Does not exist"
fi
Если вы также хотите выполнить сопоставление, когда число является последним в строке, то есть ,
после него ничего не следует, вы можете использовать grep -E
расширенные регулярные выражения, а затем выполнить сопоставление.илиa, 329
за которым следует запятая ( 329,
) или a 329
, которая находится в конце строки ( 329$
). Вы можете объединить их следующим образом:
if grep -Ewq "329(,|$)" myfile; then
echo "Exists"
else
echo "Does not exist"
fi
решение2
Другой альтернативой может быть:
if cat myfile | tr "," "\n" | grep -xqF "329"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
С уважением