Chciałem wyświetlić zawartość pliku pwd i wyświetlić tylko plik zaczynający się od kropki. Próbowałem, ls -a | grep ^\.
ale nie mogę zrozumieć, dlaczego dane wyjściowe zawierają również pliki, które nie zaczynają się od kropki. Na przykład:
Pictures
.pip
.pki
.profile
projects
Public
Wiem, że mogę osiągnąć to, co chcę ls -ld .*
, jestem ciekawy tego zachowania grepa, którego nie potrafię wyjaśnić.
grep
regular-expression
ps-aux
źródło
źródło
ls -d .*
wymienić wszystkie pliki zaczynające się od.
?Odpowiedzi:
Przytoczyć argument
grep
, tym samymls -a | grep '^\.'
Powodem tego jest to, że powłoka obsługuje
\.
i zamienia ją z powrotem w zwykły.
, którygrep
następnie traktuje jako jednoznaczny znak wieloznaczny. W razie wątpliwości zawsze cytuj ciąg znaków, który zawiera (lub może zawierać) znak specjalny dla powłoki.źródło
grep ^\\.
\\ jest traktowane przez powłokę jako pojedynczy odwrotny ukośnik, a ponownie grep traktuje pojedynczy odwrotny ukośnik, a następnie kropkę jako dosłowną kropkę.Musisz umieścić wyrażenie grep w cudzysłowie.
Uwaga: Nie analizuj danych wyjściowych
ls
polecenia .źródło
Jeśli wykonasz cmd ls -a | grep ^ \. wtedy grep nie uważa „\” za znak specjalny i znaczenie „.” nie uciekaj.
Kiedy używamy cmd ls -a | grep „^ \.” następnie grep uważa „\” za znak specjalny i znaczenie „.” ucieka. To da wynik zgodnie z oczekiwaniami.
Jeśli chcesz używać grep cmd bez cudzysłowów, powinieneś również unikać znaku „\”. Możesz oczekiwać wyniku bez podwójnych cudzysłowów, wykonując następujące polecenie. ls -a | grep ^ \\.
Aby uzyskać szczegółowe informacje na temat znaczenia znaków specjalnych w Regex, zapoznaj się z poniższym linkiem. http://www.regular-expressions.info/quickstart.html
źródło