2015-01-27 22 views
5

Non capisco il motivo per cui il seguente comando sed contiene un simbolo @:Perché il comando sed contenere simboli

sed '[email protected]\s*required\s*[email protected] optional [email protected]' -i /etc/pam.d/sshd 

Ho guardato /etc/pam.d/sshd per la prima/dopo effetti di questo comando:

PRIMA:

... 
# Set the loginuid process attribute. 
session required  pam_loginuid.so 
... 

DOPO:

... 
# Set the loginuid process attribute. 
session optional pam_loginuid.so 
.... 

Il simbolo @ è forse parte della regex o della sintassi sed? Impossibile trovare alcun documento su questo.

Nota: Il comando precedente sed è in realtà parte di un comando Dockerfile RUN nel tutorial: https://docs.docker.com/examples/running_ssh_service/

risposta

5

Questi sono delimitatori alternativi per le espressioni regolari e stringa di sostituzione. Comodo quando la tua espressione regolare o la stringa di sostituzione include "/".

+2

Si dovrebbe anche Si noti che questa non è una convenzione specifica 'sed', ma è anche supportata da Perl e da altri linguaggi che consentono di specificare il delimitatore regex. –

4

Dal sed manual

La sintassi dei s (come sostituto) comando è ‘s/regexp/pezzi/flags’. I/caratteri possono essere sostituiti uniformemente da qualsiasi altro singolo carattere all'interno di qualsiasi comando s specificato. Il carattere/(o qualunque altro carattere è usato al suo posto) può apparire nella regexp o nella sostituzione solo se è preceduto da un \ carattere.

Dal POSIX specification:

[2addr] s/BRE/sostituzione/bandiere

Sostituto la stringa di sostituzione per le istanze della BRE nello spazio modello. Qualsiasi carattere diverso da < barra rovesciata> o < newline> può essere utilizzato al posto di a per delimitare BRE e la sostituzione. All'interno del BRE e della sostituzione, il delimitatore BRE stesso può essere utilizzato come carattere letterale se è preceduto da una barra rovesciata <>.

0

come altri dice, è un altro delimitatore di traditionnal / nell'azione s///. Questo è di solito utilizzata quando / è trovato/parte del modello come cercare (o sostituire da) un percorso Unix che hanno bisogno di sfuggire alla /

s/\/my\/path/\/Your\/path/ 
# same as 
[email protected]/[email protected]/Your/[email protected] 

È utilizzare spesso un carattere che non è alfanumerico (ma si può). L'unica (logica) vincolo è quello di evitare un carattere speciale (significato aka speciale come ^$[]{}()+\*.) per regex che rendono difficile la lettura (ma functionnal) e senza la caratteristica di questo personaggio nel modello

echo "b(a)l" | sed 's(.)()(' 
Problemi correlati