Использование grep для поиска строки, в которой есть точка

196

Я пытаюсь найти строку 0.49(с точкой) с помощью команды

grep -r "0.49" *

Но происходит то, что я также получаю нежелательные результаты, которые содержат строку, такую ​​как 0449, и 0949т. Д. Дело в том, что Linux рассматривает точку (.) Как любой символ и выдает все результаты. Но я хочу получить результат только за «0,49».

Варун Кумар
источник

Ответы:

238

grepиспользует регулярные выражения; .означает «любой символ» в регулярном выражении. Если вы хотите символьной строки, используйте grep -F, fgrepили спасаясь от .до \..

Не забудьте обернуть вашу строку в двойные кавычки. Или же вы должны использовать\\.

Итак, ваша команда должна быть:

grep -r "0\.49" *

или

grep -r 0\\.49 *

или

grep -Fr 0.49 *
geekosaur
источник
58
Мне нужно было убежать дважды, чтобы \\.это сработало. Я использую Zsh.
Никос
5
@NikosRenieris ты обернул свою строку с двойными кавычками?
Юстус Ромейн
@JustusRomijn Я думаю, что да, да.
Никос
15
вам также понадобится использовать \\.для bash или использовать "\."для выхода из оболочки.
Томофуми,
36

grep -F -r '0.49' *обрабатывает 0.49 как «фиксированную» строку вместо регулярного выражения. Это заставляет .терять свое особое значение.

Joni
источник
22

Вам нужно сбежать .как "0\.49".

A .- это метасимвол регулярного выражения, соответствующий любому символу (кроме новой строки). Чтобы соответствовать буквальному периоду, вам нужно избежать его.

codaddict
источник
5

Вы также можете использовать «[.]»

grep -r "0[.]49"
скан
источник
5

Здесь так много ответов, предлагающих уйти от точки, \.но я снова и снова сталкиваюсь с этой проблемой:\. дает мне тот же результат, что и.

Тем не менее, эти два выражения работают для меня:

$ grep -r 0\\.49 *

И:

$ grep -r 0[.]49 *

Я использую "нормальную" оболочку bash в Ubuntu и Archlinux.

Редактировать или, согласно комментариям:

$ grep -r '0\.49' *

Обратите внимание, одинарные кавычки делают разницу здесь.

Afr
источник
3
Вам нужно заключить регулярное выражение в оболочку или избежать обратной косой черты, чтобы оболочка не использовала его. grep '\.'или grep \\.(я бы настоятельно рекомендовал первый вариант. Двойные кавычки тоже работают, как и в первоначальном вопросе; но одинарные кавычки легче понять и использовать. Например, в двойных кавычках вам все равно придется удваивать обратную косую черту в некоторых сценариях ).
tripleee
ИМХО, это самый ясный правильный ответ, с комментарием @tripleee он самый полный. использование [] (которое служит для представления подмножества символов, совпадающего с одним символом) является хорошим подспорьем.
Джингоут
@jringoot Серьезно? Я думаю, что это не совсем понятно - это больше похоже на вопрос от кого-то, кто не был знаком с цитированием.
Трипли
Это понятно, потому что оба выражения работают напрямую, и, действительно, многие другие предполагают использование кавычек или необходимость двойного экранирования, чтобы избежать вторичной интерпретации оболочкой как тривиального. Я больше не могу изменить комментарий (5 минут). Мой комментарий мог бы быть лучше: «это, если объединить его с комментарием @tripleee, это самый полный ответ. Потому что обе команды работают сразу, а с цитированием это завершено»
jringoot
1
Обычно я рекомендую всегда заключать в кавычки ваши регулярные выражения. Это не «завершено», но оно выполняет свою работу и подразумевает, что вам нужно либо понимать цитаты, либо жить по этому простому правилу.
tripleee
4

Побег точка. Пример команды будет.

grep '0\.00'
tuxuday
источник
4

Вы можете экранировать точку и другие специальные символы, используя \

например. grep -r "0 \ .49"

Кевин Дэвис
источник
Напоминание будущему читателю, \.окружение кавычками необходимо, чтобы оно заработало.
Фрукты
1

Вы также можете искать с параметром -, который в основном игнорирует все специальные символы и не будет интерпретироваться grep.

$ cat foo |grep -- "0\.49"
СМЦ
источник