我期望这两个 sed 命令是等效的,但mozilla/DST_Root_CA_X3.crt
仅在第二种情况下被删除,为什么?
如果重要的话,我正在使用 sed 4.4 和 Debian Stretch
(stretch-arm64)ubuntu@ip-10-1-2-224:~$ sudo sed '#^mozilla/DST_Root_CA_X3.crt$#d' test-certificates.conf
mozilla/Verisign_Class_3_Public_Primary_Certification_Authority_-_G3.crt
mozilla/XRamp_Global_CA_Root.crt
mozilla/certSIGN_ROOT_CA.crt
mozilla/ePKI_Root_Certification_Authority.crt
mozilla/emSign_ECC_Root_CA_-_C3.crt
mozilla/emSign_ECC_Root_CA_-_G3.crt
mozilla/emSign_Root_CA_-_C1.crt
mozilla/emSign_Root_CA_-_G1.crt
mozilla/DST_Root_CA_X3.crt
(stretch-arm64)ubuntu@ip-10-1-2-224:~$ sudo sed '/^mozilla\/DST_Root_CA_X3.crt$/d' test-certificates.conf
mozilla/Verisign_Class_3_Public_Primary_Certification_Authority_-_G3.crt
mozilla/XRamp_Global_CA_Root.crt
mozilla/certSIGN_ROOT_CA.crt
mozilla/ePKI_Root_Certification_Authority.crt
mozilla/emSign_ECC_Root_CA_-_C3.crt
mozilla/emSign_ECC_Root_CA_-_G3.crt
mozilla/emSign_Root_CA_-_C1.crt
mozilla/emSign_Root_CA_-_G1.crt
答案1
以下所有内容在任何地方都有效sed
,而不仅仅是 GNU sed
。
该#
角色发表评论。它可以被认为是一个“注释命令”,可以sed
忽略该指令的其余部分。这就是为什么你的命令不做任何事情,都不会产生错误。
要用#
作用作地址的正则表达式的替代分隔符,请使用\#...#
。这对于#
您想要用作替代分隔符的任何字符来说并不特殊。
那些字符不能在这种情况下用作分隔符的是反斜杠和换行符。通常也不支持使用多字节字符。
无需进行特殊转义即可用作命令 ( )#
中的分隔符。s
s#...#...#
唯一#
不仅仅充当注释字符的情况是sed
编辑脚本中的前两个字符是#n
。这相当于sed
使用其-n
选项运行(在每个周期结束时关闭编辑缓冲区的默认输出)。
$ echo hello | sed -e 'y/h/y/'
yello
$ echo hello | sed -e '#n' -e 'y/h/y/'
$ echo hello | sed -e '#n' -e 'y/h/y/' -e p
yello