Kiedy piszę
$ grep \$
wtedy cokolwiek napiszę na terminalu, zostanie dopasowane i wydrukowane na terminalu. Jak \$
się interpretuje?
Kiedy piszę
$ grep \$
wtedy cokolwiek napiszę na terminalu, zostanie dopasowane i wydrukowane na terminalu. Jak \$
się interpretuje?
Odpowiedzi:
Powłoka jest interpretowanie \$
i przepuszczenie go przez do grep jako $
, znaku końca linii. Zakładając, że twoja linia ma koniec, będzie pasować :-)
Jeśli chcesz dopasować rzeczywisty $
grep, użyj jednego z:
grep \\\$
grep '\$'
W pierwszym przypadku powłoka interpretuje \\
jako \
i \$
jako $
dawanie \$
. W drugim przypadku wcale tego nie interpretuje.
Jeśli chodzi o twoje pytanie, dlaczego \$
pasuje do znaku dolara, a raczej do dwuznakowej sekwencji, wyrażenia regularne, takie jak używane w grep
pewnych celach, używają znaków specjalnych. Niektóre z nich to:
$ end of line
^ start of line
. any character
+ 1 or more of the preceeding pattern
* 0 or more of the preceeding pattern
{n,m} between n and m of the preceeding pattern
[x-y] any character between x and y (such as [0-9] for a digit).
wraz z wieloma innymi.
Jeśli chcesz dopasować literę, która jest zwykle traktowana jako znak specjalny, musisz uciec od niej, aby grep
traktować ją jak normalną postać.
ls \$
i przekonać się, że otrzymujemy „ls: $: Brak takiego pliku lub katalogu”, aby zobaczyć, że \ $ jest nieokreślone na $, ale \\ $ jest nieskalowane na \ $ i tak dalej.
Powłoka najpierw rozwija sekwencje specjalne przed przekazaniem argumentów do programu, dlatego interpretuje \$
sekwencję ucieczki i przekazuje pojedynczy argument $
do grep
, który pasuje do końca linii. Ponieważ każda linia ma koniec, każda linia powinna pasować :)
man grep
; podjęto decyzję, że $
dopasowuje koniec linii, niezależnie od tego, czy linie są oddzielone \n
, \r
zarówno, czy coś zupełnie innego. W ogólnym przypadku można użyć wyrażeń regularnych do dopasowania dowolnego łańcucha, nie tylko „linii”, i $
do dopasowania końca łańcucha.
Jest interpretowany jako metaznak końca linii. Jeśli chcesz dopasować rzeczywisty znak dolara, zrób
$ grep \\$
lub
$ grep '\$'
Możesz uniknąć kłopotów z ucieczką, jeśli chcesz szukać literału $
, używając wyrażenia regularnego dla klasy znaków. Na przykład,
$ grep '[$]' file
echo \$
a następnieecho \\$