Jak interpretuje \ $ grep?


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ć.


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


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 '\$' 

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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.