Come viene interpretato \ $ da grep?


12

Quando scrivo

$ grep \$  

quindi qualunque cosa scrivo sul terminale, viene abbinata e stampata sul terminale. Come viene \$interpretato?

Risposte:


18

La shell sta interpretando \$e passando attraverso grep come $, il carattere di fine riga. Quindi supponendo che la tua linea abbia una fine, corrisponderà :-)

Se vuoi abbinare un vero $in grep, usa uno di:

grep \\\$
grep '\$'

Nel primo caso, la shell interpreta \\come \e \$come $dare \$. In quest'ultimo caso, non lo interpreta affatto.


Per quanto riguarda la tua domanda sul perché \$corrisponda al simbolo del dollaro piuttosto che alla sequenza di due caratteri, espressioni regolari come quelle utilizzate grepnell'uso di caratteri speciali per alcuni scopi. Alcuni di questi sono:

$       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).

insieme a molti altri.

Quando si desidera abbinare un personaggio letterale che viene normalmente trattato come un personaggio speciale, è necessario evitarlo in modo da trattarlo come un personaggio grepnormale.


1
per testare ciò che vede grep, prova echo \$e poiecho \\$

In grep \\\ $, come hai detto, \ $ viene passato a grep, quindi dovrebbe corrispondere alle stringhe che contengono \ $, ma perché corrisponde a quelle stringhe che contengono solo $?

Perché $ in grep significa un fine riga. Per abbinare il personaggio $, devi scappare, quindi grep non lo tratta in modo speciale. Vedi il mio aggiornamento

@Pasi: echo esegue il proprio escape, a seconda che si tratti di una shell incorporata o meno, conforme a POSIX o no, ecc. È meglio (IMHO) usare ls \$e vedere che otteniamo "ls: $: nessun file o directory", per vedere che \ $ non è convertito in $ ma \\ $ non è convertito in \ $ e così via.
Henno,

5

La shell espande innanzitutto tutte le sequenze di escape prima di passare gli argomenti al programma, quindi interpreta la \$sequenza di escape e passa il singolo argomento $a grep, che corrisponde alla fine della riga. Poiché ogni riga ha una fine, allora ogni riga deve corrispondere :)


Ma come $ è la fine della linea? La fine della riga non è \ n?

2
@Happy Mithal: vedi man grep; è stato deciso che $corrisponde alla fine della linea, a prescindere dal fatto che le linee sono separate da \n, \rsia, o qualcosa di completamente diverso. Nel caso generale, le espressioni regolari possono essere usate per abbinare qualsiasi stringa, non solo una "linea", e $sono usate per abbinare la fine della stringa.

2

Viene interpretato come il metacarattere di fine linea. Se vuoi abbinare un segno di dollaro reale, fallo

 $ grep \\$ 

o

 $ grep '\$' 

1

^è per l'inizio della stringa e $per la fine.

grep \$

o

grep $

corrisponderà a ogni stringa, quindi qualsiasi cosa digiti verrà ripetuta.

Provare

grep a$

Ora, solo le stringhe il cui ultimo carattere è averranno abbinate ed echeggiate .


1

Puoi evitare il problema di scappare se vuoi cercare un valore letterale $, usando l'espressione regolare per la classe di caratteri. Per esempio,

$ grep '[$]' file
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.