Chcę wiedzieć, które pliki mają ciąg $Id$.

grep \$Id\$ my_dir/mylist_of_files 

zwraca 0 wystąpień.

Odkryłem, że muszę użyć

grep \$Id$ my_dir/mylist_of_files

Następnie widzę, że $Id jest pokolorowany na wyjściu, tj. został dopasowany.

Jak mogę dopasować druga $ i dlaczego nie działa „t \$Id\$.

Nie ma znaczenia, czy druga $ to ostatni znak lub nie.

Używam grep 2.9.


Wcześniej zamieszczając swoje pytanie, korzystałem z Google …

znalazłem odpowiedź

Aby wyszukać $ (znak dolara) w pliku o nazwie test2, wprowadź:

grep \\ $ test2

Znaki \\ (podwójny lewy ukośnik) są konieczne, aby zmusić powłokę do przekazania \ $ (pojedynczy lewy ukośnik, znak dolara) do polecenia grep. Znak \ (pojedynczy lewy ukośnik) informuje polecenie grep, aby traktować następujący znak (w tym przykładzie $) jako znak literału, a nie znak wyrażenia. Użyj polecenia fgrep, aby uniknąć konieczności używania znaków zmiany znaczenia, takich jak ukośnik odwrotny.

, ale nie rozumiem, dlaczego grep \$Id działa i dlaczego grep \\$Id\\$ nie „t.

Jestem trochę zdezorientowany …

Odpowiedź

Są tu dwa oddzielne problemy.

  1. grep używa Podstawowe wyrażenia regularne (BRE), a $ to znak specjalny w BRE „znajduje się tylko na końcu wyrażenia. Konsekwencją tego jest to, że dwa wystąpienia $ w $Id$ nie są równe. pierwszy to zwykły znak, a drugi to kotwica pasująca do końca wiersza. Aby drugi $ dopasować do literału $ „będziesz musiał uciec od ukośnika odwrotnego, np. $Id\$. Zmiana znaczenia dla pierwszego $ działa również: \$Id\$, a ja wolę to, ponieważ wygląda bardziej spójnie.¹

  2. Działają tutaj dwa zupełnie niezwiązane ze sobą mechanizmy ucieczki / cytowania: cytowanie powłoki i cytowanie wyrażenia regularnego z ukośnikiem odwrotnym. Problem polega na tym, że wiele znaków, których używają wyrażenia regularne, jest również wyjątkowych dla powłoki, a ponadto znak ucieczki wyrażenia regularnego, ukośnik odwrotny, jest również znakiem cudzysłowu powłoki. Dlatego często widzisz bałagan z podwójnymi odwrotnymi ukośnikami, ale nie polecam używania odwrotnych ukośników do cytowania wyrażeń regularnych w powłoce, ponieważ nie jest to zbyt czytelne.

    Zamiast tego najprostszym sposobem na to jest umieszczenie całe wyrażenie regularne w pojedynczych cudzysłowach, jak w "regex". Pojedynczy cudzysłów jest najsilniejszą formą cytowania, jaką posiada powłoka, więc dopóki twoje wyrażenie regularne nie zawiera pojedynczych cudzysłowów, nie musisz już martwić się cytowaniem w powłoce i możesz skupić się na czystej składni BRE.

Stosując to z powrotem do oryginalnego przykładu, wrzućmy poprawne wyrażenie regularne (\$Id\$) w pojedyncze cudzysłowy. Poniższe czynności powinny zrobić, co chcesz:

grep "\$Id\$" my_dir/my_file 

Przyczyną niedziałającego działania \$Id\$ jest to, że po usunięciu cytatów powłoki (bardziej poprawnym sposobem na powiedzenie powłoki cytowanie), wyrażenie regularne, które grep widzi, to $Id$. Jak wyjaśniono w (1.), to wyrażenie regularne jest zgodne z literałem $Id tylko na końcu linii, ponieważ pierwszy $ jest dosłowny, a drugi to specjalny znak kotwicy.

¹ Zauważ również, że jeśli kiedykolwiek przełączysz się na rozszerzone wyrażenia regularne (ERE), np. jeśli zdecydujesz się użyć egrep (lub grep -E), znak $ jest zawsze specjalny. W ERE „s $Id$ nigdy by niczego nie dopasował, ponieważ nie możesz mieć znaków po końcu wiersza, więc \$Id\$ to jedyna droga.

Komentarze

  • Aby uniknąć interpretowania przez grep pierwszego parametru jako wyrażenia regularnego , możesz także wykonać grep -F '$Id$'.
  • W mojej powłoce (bash 4.3.42) grep '$Id\$' ... i grep \$Id\\$ ... praca
  • A jeśli jest to polecenie w pliku makefile, musisz również uciec przed $ z poprzedzającym $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

Odpowiedź

Aby wyszukać $Id$ w pliku: możesz użyć: grep "\$id*" filename

Komentarze

  • To dopasuje wszystko, co zaczyna się od $id, więc na przykład $idea, a nie tylko $id$ .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *