2015-01-27 11 views
5

Nie rozumiem dlaczego następujące polecenie sed zawiera symbol @:Dlaczego polecenia sed zawierać symboli

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

Szukałem na /etc/pam.d/sshd dla przed/po skutki tego polecenia:

Przed:

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

PO:

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

Czy symbol @ jest prawdopodobnie częścią składni regex lub sed? Nie można znaleźć żadnego dokumentu na ten temat.

Uwaga: Powyższe polecenie sed jest faktycznie częścią polecenia Dockerfile RUN w tutorialu: https://docs.docker.com/examples/running_ssh_service/

Odpowiedz

5

Są alternatywne ograniczniki dla wyrażeń regularnych i wymiana łańcucha. Poręczny, gdy twój ciąg regex lub zastępczy zawiera "/".

+2

Należy również należy zauważyć, że nie jest to konwencja 'sed', ale jest również obsługiwana przez Perl i inne języki, które umożliwiają określenie ogranicznika regex. –

4

Z sed manual

Składnia s (jak w zastępstwie) polecenia jest 's/regexp/wymiany/flags. Znaki/mogą być równomiernie zastępowane przez dowolny inny pojedynczy znak w dowolnym poleceniu s. Znak/(lub jakikolwiek inny znak jest używany zamiast niego) może pojawić się w wyrażeniu regularnym lub zastępczym tylko wtedy, gdy jest poprzedzony znakiem \.

Z POSIX specification:

[2addr] s/BRE/zamiennik/flagi

Zastępca ciąg zamiennik wystąpień BRE w przestrzeni wzorca. Dowolny znak inny niż < ukośnik odwrotny> lub < nowa linia> może być użyty zamiast a do ograniczenia BRE i zamiennika. W obrębie BRE i zastąpienia sam ogranicznik BRE może być używany jako znak dosłowny, jeśli jest poprzedzony znakiem zachęty z odwrotnym ukośnikiem>.

0

jako drugi mówi, że jest inny niż separator Traditionnal / w akcji s///. To jest zwykle używany, gdy / znajduje/część wzoru jak szukają (lub zastąpienia przez) ścieżkę UNIX, które trzeba uciec /

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

często używać znaku, który nie jest alfa numeryczny (ale można). Jedyny (logiczny) ograniczeniem jest uniknięcie znak specjalny (aka szczególne znaczenie jak ^$[]{}()+\*.) dla regex, które sprawiają, że trudno odczytać (ale functionnal) i bez cechą tego znaku we wzorcu

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