哪些字符与^组合不需要在sed中转义?

时间:2018-08-21 08:14:38

标签: regex sed gnu-sed

我检查了^*^&是否匹配以*&开头的行,我没有这么做,因为它们是特殊字符。但是^[不起作用。这是“标准”行为吗?这背后有什么根据吗?

sed使用的版本是“ GNU sed 4.4”。

2 个答案:

答案 0 :(得分:2)

请参见sed "3.3 Overview of Regular Expression Syntax" documentation

&字符不是特殊的正则表达式字符,它不需要以正则表达式模式转义。请注意,&可以作为 replacement 模式中的特殊构造进行解析,其中is表示整个匹配项。

*在GNU sed中开头时并不特殊(^*是在字符串开头与*匹配的模式):

  

POSIX 1003.1-2001指出*代表它在正则表达式或子表达式的开头出现,但是许多nonGNU实现不支持此功能,可移植脚本应在其中使用\*这些背景。

[开始一个括号表达式,并且必须有成对的]才能关闭该表达式,因此是错误的。

答案 1 :(得分:2)

来自POSIX.1-2017

  

sed实用程序应支持XBD Basic Regular Expressions,... [{sed]

中描述的BRE

在阅读有关BRE的POSIX部分时,我们读到:

  

BRE特殊字符在某些情况下具有特殊属性。在这些上下文之外,或在前面加上<反斜杠>时,此类字符是与特殊字符本身匹配的BRE。 BRE特殊字符及其具有特殊含义的上下文如下:

     
      
  • .[\   除在方括号表达式中使用时,应该是特殊的(请参见RE Bracket Expression)。 包含未转义且不属于括号表达式的'['的表达式会产生不确定的结果。
  •   
  • *   在使用时应为特殊的除外:      
        
    • 在方括号表达式中
    •   
    • 作为整个BRE的第一个字符(在首字母'^'之后,如果有的话)
    •   
    • 作为子表达式的第一个字符(在初始“ ^”之后,如果有的话);参见BRE Matching Multiple Characters
    •   
  •   
  • ^   在用作锚点时应是特殊的(请参见BRE Expression Anchoring)。 表示不匹配的列表表达式,当它首先出现在列表中时,紧跟在之后(请参见RE Bracket Expression)。
  •   
  • $   当用作锚点时,应该是特殊的。
  •   
     

来源:Basic Regular Expressions, Special characters

因此,要使用上述方法回答操作问题:

  • &不是特殊字符,因此^&应该可以工作
  • 如果
  • [不用作方括号表达式,则应始终对其进行转义。
  • *在初始^之后是特殊的,而后者是锚。

因此,OP观察到的所有陈述都是有效的。

不过,RE Bracket Expression中还有一段有趣的段落:

  

中括号表达式可以是匹配列表表达式,也可以是不匹配列表表达式。它由一个或多个表达式组成:普通字符,整理元素,整理符号,对等类,字符类或范围表达式。 ])将失去其特殊含义,并且如果在列表中首先出现(在初始 >(^,如果有的话)。否则,它将终止方括号表达式,除非它出现在归类符号中(例如[.].]),或者是归类符号,对等类或字符类的结尾 。特殊字符.*[\\(分别为 )将在方括号表达式内失去其特殊含义。

     

来源:Basic Regular Expressions, RE Bracket Expression

这意味着]不能在方括号表达式中转义。这意味着:

以下工作:

$ echo '[]' | sed 's/[^]x]/a/'
a]
$ echo '[]' | sed 's/[^x[.].]]/a/'
a]

但这不能按预期工作:

$ echo '[]' | sed 's/[^x\]]/a/'
[]

因此,在方括号表达式中,不要转义它,而要对其进行整理!