我检查了^*
和^&
是否匹配以*
和&
开头的行,我没有这么做,因为它们是特殊字符。但是^[
不起作用。这是“标准”行为吗?这背后有什么根据吗?
sed
使用的版本是“ GNU sed 4.4”。
答案 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)。 $
: 当用作锚点时,应该是特殊的。
因此,要使用上述方法回答操作问题:
&
不是特殊字符,因此^&
应该可以工作[
不用作方括号表达式,则应始终对其进行转义。*
在初始^
之后是特殊的,而后者是锚。因此,OP观察到的所有陈述都是有效的。
不过,RE Bracket Expression中还有一段有趣的段落:
中括号表达式可以是匹配列表表达式,也可以是不匹配列表表达式。它由一个或多个表达式组成:普通字符,整理元素,整理符号,对等类,字符类或范围表达式。
( 。特殊字符]
)将失去其特殊含义,并且如果在列表中首先出现(在初始>( 。否则,它将终止方括号表达式,除非它出现在归类符号中(例如^
,如果有的话)[.].]
),或者是归类符号,对等类或字符类的结尾.
,*
,[
和\\
(分别为, , 和 )将在方括号表达式内失去其特殊含义。
这意味着]
不能在方括号表达式中转义。这意味着:
以下工作:
$ echo '[]' | sed 's/[^]x]/a/'
a]
$ echo '[]' | sed 's/[^x[.].]]/a/'
a]
但这不能按预期工作:
$ echo '[]' | sed 's/[^x\]]/a/'
[]
因此,在方括号表达式中,不要转义它,而要对其进行整理!