Використання 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 *

58
Мені потрібно було втекти двічі, як щоб \\.воно спрацювало. Я використовую zsh.
Нікос Реньєріс

5
@NikosRenieris Ви обмотали рядок із подвійними лапки?
Юстус Ромінь

@JustusRomijn Я думаю, що так і зробив.
Нікос Реньєріс

15
вам також потрібно використовувати \\.для bash, або використовувати "\."для втечі від оболонки.
Томофумі

36

grep -F -r '0.49' *трактує 0,49 як "фіксовану" рядок замість регулярного виразу. Це змушує .втратити своє особливе значення.


22

Вам потрібно уникнути .як "0\.49".

A .- це метагерой регулярного вираження, який відповідає будь-якому символу (крім нового рядка). Щоб відповідати буквальному періоду, вам потрібно уникнути цього.




5

Тут є дуже багато відповідей, що дозволяють уникнути крапки, \.але я знову і знову стикаюся з цим питанням: \.дає мені такий же результат, як.

Однак ці два вирази працюють на мене:

$ grep -r 0\\.49 *

І:

$ grep -r 0[.]49 *

Я використовую "звичайну" оболонку bash для Ubuntu та Archlinux.

Редагувати, або, відповідно до коментарів:

$ grep -r '0\.49' *

Зауважте, що сингли -котати роблять тут різницю.


3
Потрібно цитувати регулярний вираз із оболонки або уникати зворотної косої риси, щоб оболонка не споживала її. grep '\.'або grep \\.(я б настійно рекомендував попередні. Подвійні лапки теж працюють, як і в оригінальному запитанні; але одиничні лапки легше зрозуміти і використовувати. Наприклад, з подвійними лапками вам все одно потрібно подвоїти зворотний кут нахилу в деяких сценаріях ).
трійчатка

ІМХО, це найясніша правильна відповідь, з коментарем @tripleee це найповніше. використання [] (які функції представити підмножину символів, щоб відповідати одному символу) - хороший хак.
jringoot

@jringoot Серйозно? Я думаю, що це зовсім не ясно - це більше схоже на подальше запитання від того, хто не був знайомий з цитуванням.
трійчатка

Зрозуміло, тому що обидва вирази працюють безпосередньо, і справді багато інших припускають цитування або потребу в подвійному уникненні, щоб уникнути вторинної інтерпретації оболонкою як тривіальної. Я більше не можу змінити коментар (5 хвилин). Мій коментар міг би бути кращим: "це, якщо поєднати з коментарем @tripleee, це найповніша відповідь. Тому що обидві команди працюють негайно, а цитування - повне"
jringoot

1
Зазвичай я рекомендую "завжди цитувати свої регулярні вирази". Це не "повно", але це виконує роботу і означає, що вам потрібно зрозуміти цитування або жити за цим простим правилом.
трійчатка


4

Ви можете уникнути точки та інших спеціальних символів, використовуючи \

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


Нагадування майбутньому читачеві, \.оточення цитатами необхідно, щоб він працював.
Фрукти

1

Ви також можете шукати з - опцією, яка в основному ігнорує всі спеціальні символи, і вона не буде інтерпретована грепом.

$ cat foo |grep -- "0\.49"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.