为什么sed命令包含符号

问题描述:

我不明白,为什么下面的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/

这些都为正则表达式和替换字符串替换分隔符。当正则表达式或替换字符串包含'/'时,方便使用。

+2

还应请注意,这不是'sed'特定的约定,但是Perl和其他语言也支持您指定正则表达式分隔符。 – 2015-01-27 00:28:38

sed manual

的S的语法(如替代)的命令是“S /正则表达式/更换/标志”。在任何给定的s命令中,/字符可以被任何其他单个字符统一替换。 /字符(或任何其他字符代替它)只有在前面加上\字符才能出现在正则表达式或替换字符中。

POSIX specification

[2addr] S/BRE /更换/标志

替换字符串替换为在模式空间的BRE的实例。可以使用除<反斜杠>或<换行符之外的任何字符来代替BRE和替换。在BRE和替换中,如果BRE分隔符前面有一个<反斜杠>,则它可以用作文字字符。

正如其他人所说,这是s///行动中与traditionnal /相比的另一个分隔符。当/找到该模式的/部分像搜索(或更换)需要躲避/

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

您经常使用的字符不是字母数字Unix的路径这通常用于(但你可以)。唯一的(逻辑)约束是为了避免一个特殊字符(又名特殊含义一样^$[]{}()+\*.)为正则表达式,使它难以阅读(但functionnal),并没有这个人物的特征在模式

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