Quando scrivo
$ grep \$
quindi qualunque cosa scrivo sul terminale, viene abbinata e stampata sul terminale. Come viene \$interpretato?
Quando scrivo
$ grep \$
quindi qualunque cosa scrivo sul terminale, viene abbinata e stampata sul terminale. Come viene \$interpretato?
Risposte:
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.
ls \$e vedere che otteniamo "ls: $: nessun file o directory", per vedere che \ $ non è convertito in $ ma \\ $ non è convertito in \ $ e così via.
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 :)
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.
Viene interpretato come il metacarattere di fine linea. Se vuoi abbinare un segno di dollaro reale, fallo
$ grep \\$
o
$ grep '\$'
echo \$e poiecho \\$