Jak interpretuje \ $ grep?

12

Kiedy piszę

$ grep \$  

wtedy cokolwiek napiszę na terminalu, zostanie dopasowane i wydrukowane na terminalu. Jak \$się interpretuje?

Happy Mittal
źródło

Odpowiedzi:

18

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 greppewnych 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 greptraktować ją jak normalną postać.


źródło
1
aby sprawdzić, co widzi grep, spróbuj, echo \$a następnieecho \\$
W grep \\\ $, jak powiedziałeś, \ $ jest przekazywane do grep, więc powinno pasować do ciągów zawierających \ $, ale dlaczego pasuje do tych ciągów, które zawierają tylko $?
Ponieważ $ w grep oznacza koniec linii. Aby dopasować znak $, musisz uciec, aby grep nie traktował go specjalnie. Zobacz moją aktualizację.
@Pasi: echo wykonuje własne odwzorowanie, w zależności od tego, czy jest to powłoka wbudowana, czy nie, zgodna z POSIX, czy nie, itp. Lepiej jest (IMHO) użyć 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.
Henno,
5

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ć :)

Nick Meyer
źródło
Ale jak $ to koniec linii? Czy to nie koniec linii \ n?
2
@Happy Mithal: Zobacz man grep; podjęto decyzję, że $dopasowuje koniec linii, niezależnie od tego, czy linie są oddzielone \n, \rzaró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.
2

Jest interpretowany jako metaznak końca linii. Jeśli chcesz dopasować rzeczywisty znak dolara, zrób

 $ grep \\$ 

lub

 $ grep '\$' 

źródło
1

^jest na początku łańcucha i $na końcu.

grep \$

lub

grep $

dopasuje każdy ciąg, więc wszystko, co wpiszesz, jest odtwarzane z powrotem.

Próbować

grep a$

Teraz tylko ciągi, których ostatnim znakiem jest znak, azostaną dopasowane i powtórzone .

N 1.1
źródło
1

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
użytkownik31894
źródło