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 …
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.
-
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.¹ -
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
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$
.
grep -F '$Id$'
.grep '$Id\$' ...
igrep \$Id\\$ ...
praca$
z poprzedzającym$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284