греп і втеча знак долара


31

Я хочу знати, які файли мають рядок $Id$.

grep \$Id\$  my_dir/mylist_of_files

повертає 0 випадків.

Я виявив, що мені потрібно користуватися

grep \$Id$ my_dir/mylist_of_files

Потім я бачу, що $Idкольоровий колір на виході, тобто він був зіставлений.

Як я міг співставити другий $і чому не \$Id\$працює.

Не має значення, другий $є останнім символом чи ні.

Я використовую grep2,9.


Перш ніж надсилати запитання, я використовував google ...

Я знайшов відповідь

Щоб шукати знак $ (знак долара) у файлі з назвою test2, введіть:

grep \\ $ test2

Символи \\ (подвійний кут нахилу) необхідні для того, щоб змусити оболонку передати \ $ (один зворотний косий знак, знак долара) команді grep. Символ \ (один зворотний косий рядок) вказує команді grep розглянути наступний символ (у цьому прикладі $) як буквальний символ, а не як символ вираження. Використовуйте команду fgrep, щоб уникнути необхідності використання символів втечі, таких як косої риски.

але я не розумію, чому grep \$Idпрацює, а чому grep \\$Id\\$ні.

Я трохи розгублений ...

Відповіді:


25

Тут є два окремих питання.

  1. grepвикористовує базові регулярні вирази (BRE) і $є спеціальним символом у BRE лише в кінці виразу. Наслідком цього є те, що два екземпляри $in $Id$не є рівними. Перший - це нормальний символ, а другий - якір, який відповідає кінці рядка. Щоб зробити другий $матч буквальним, $вам доведеться відхилити його від нахилу, тобто $Id\$. Уникнення першого $також працює: \$Id\$і я вважаю за краще це, оскільки це виглядає більш послідовно.¹

  2. Тут працюють два абсолютно не пов’язаних між собою механізми втечі / котирування: котирування оболонки та зворотне нахил зворотної коси. Проблема полягає в тому, що багато символів, які використовують регулярні вирази, є спеціальними для оболонки, а крім того, символ втечі регулярного вираження, зворотний косий рядок, також є символом, що цитує оболонку. Ось чому ви часто бачите меси, що містять подвійні риски, але я не рекомендую використовувати косої косої риски для цитування оболонок регулярних виразів, оскільки вона не дуже читабельна.

    Натомість найпростіший спосіб зробити це - спочатку помістити весь регекс всередину окремих лапок, як у 'regex'. Одиночна цитата є найсильнішою формою цитування оболонки, тому поки ваш регекс не містить одинарних лапок, вам більше не доведеться турбуватися про цитування оболонок і можете зосередитись на чистому синтаксисі BRE.

Отже, застосувавши це назад до свого оригінального прикладу, давайте кинемо правильний rgex ( \$Id\$) всередині одиничних лапок. Виконайте наступні дії:

grep '\$Id\$' my_dir/my_file

Причина \$Id\$не працює в тому, що після видалення цитати оболонки (правильніший спосіб сказати цитування оболонки) застосовується регулярний вираз, який grepбачить $Id$. Як пояснено в (1.), цей регулярний вираз відповідає збігу букваря $Idлише в кінці рядка, тому що перший $є буквальним, а другий - особливим якорним символом.

¹ Зауважте також, що якщо ви коли-небудь переходите на розширені регулярні вирази (ERE), наприклад, якщо ви вирішили використовувати egrep(або grep -E), $символ завжди особливий. У ERE $Id$ніколи нічого не буде відповідати, тому що ви не можете мати символів після закінчення рядка, тому це \$Id\$був би єдиний шлях.


3
Щоб уникнути інтерпретації грепового першого параметра як регулярного виразу, ви також можете це зробити grep -F '$Id$'.
jfg956

У моїй оболонці (баш 4.3.42) grep '$Id\$' ...і grep \$Id\\$ ...роботі
ніцас

2
І якщо це команда в Makefile, ви повинні також рятуючись від $з попередньої $: grep '$$Id\$$'. stackoverflow.com/a/2382810/2097284
Camille Goudeseune

-2

Для пошуку $Id$у файлі: ви можете використовувати:grep '\$id*' filename


2
Це буде відповідати чомусь, починаючи з цього $id, $ideaнаприклад, а не лише $id$.
terdon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.