Kiedy piszę
$ grep \$
wtedy cokolwiek napiszę na terminalu, zostanie dopasowane i wydrukowane na terminalu. Jak \$
się interpretuje?
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ć.
echo \$
a następnieecho \\$
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$
dogrep
, który pasuje do końca linii. Ponieważ każda linia ma koniec, każda linia powinna pasować :)źródło
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
lub
źródło
^
jest na początku łańcucha i$
na końcu.lub
dopasuje każdy ciąg, więc wszystko, co wpiszesz, jest odtwarzane z powrotem.
Próbować
Teraz tylko ciągi, których ostatnim znakiem jest znak,
a
zostaną dopasowane i powtórzone .źródło
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,źródło