为什么sed命令包含符号

时间:2015-01-27 00:25:30

标签: sed

我不明白为什么以下sed命令包含@符号:

sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

我看了/etc/pam.d/sshd这个命令的前/后效果:

在:

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

在:

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

@符号可能是regex或sed语法的一部分吗? 找不到任何doco。

注意:上面的sed命令实际上是教程中Dockerfile RUN命令的一部分: https://docs.docker.com/examples/running_ssh_service/

3 个答案:

答案 0 :(得分:7)

这些是正则表达式和替换字符串的备用分隔符。当你的正则表达式或替换字符串包含'/'。

时很方便

答案 1 :(得分:5)

来自sed manual

  

s(在替换中)命令的语法是's / regexp / replacement / flags'。 /字符可以由任何给定s命令中的任何其他单个字符统一替换。 /字符(或其他任何字符代替它)只有在前面带有\字符时才会出现在regexp或replacement中。

来自POSIX specification

  

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

     

将替换字符串替换为模式空间中BRE的实例。除<反斜杠>以外的任何字符或者< newline>可以用来代替a来分隔BRE和替换。在BRE和替换中,如果前面有<反斜杠>,则BRE分隔符本身可以用作文字字符。

答案 2 :(得分:0)

正如其他人所说,它是/行动中传统s///的另一个分界符。这通常在找到/ /模式的一部分时使用,例如搜索(或替换)需要转义/

的unix路径
s/\/my\/path/\/Your\/path/
# same as
s@my/path@/Your/path@

您经常使用不是字母数字的字符(但您可以)。唯一(逻辑)约束是避免使用正则表达式的特殊字符(也称为^$[]{}()+\*.的特殊含义),这使得难以阅读(但是功能性)并且在模式中没有此字符的特征

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