2015-01-27 90 views
5

我不明白,爲什麼下面的sed命令包含一個@符號:爲什麼sed命令包含符號

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

我看過上將/etc/pam.d/sshd的前/後

BEFORE:

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

AFTER:

... 
# Set the loginuid process attribute. 
session optional pam_loginuid.so 
.... 
這個命令的影響

@符號可能是正則表達式還是sed語法的一部分? 在此找不到任何doco。

注:上述sed的命令實際上是在教程Dockerfile RUN命令的一部分: https://docs.docker.com/examples/running_ssh_service/

回答

5

這些都爲正則表達式和替換字符串替換分隔符。當正則表達式或替換字符串包含'/'時,方便使用。

+2

還應請注意,這不是'sed'特定的約定,但是Perl和其他語言也支持您指定正則表達式分隔符。 – 2015-01-27 00:28:38

4

sed manual

的S的語法(如替代)的命令是「S /正則表達式/更換/標誌」。在任何給定的s命令中,/字符可以被任何其他單個字符統一替換。 /字符(或任何其他字符代替它)只有在前面加上\字符才能出現在正則表達式或替換字符中。

POSIX specification

[2addr] S/BRE /更換/標誌

替換字符串替換爲在模式空間的BRE的實例。可以使用除<反斜槓>或<換行符之外的任何字符來代替BRE和替換。在BRE和替換中,如果BRE分隔符前面有一個<反斜槓>,則它可以用作文字字符。

0

正如其他人所說,這是s///行動中與traditionnal /相比的另一個分隔符。當/找到該模式的/部分像搜索(或更換)需要躲避/

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

您經常使用的字符不是字母數字Unix的路徑這通常用於(但你可以)。唯一的(邏輯)約束是爲了避免一個特殊字符(又名特殊含義一樣^$[]{}()+\*.)爲正則表達式,使它難以閱讀(但functionnal),並沒有這個人物的特徵在模式

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