为什么在sed中这个转义字符类的顺序很重要?

Mar*_*eck 3 regex sed

这按预期工作:

>echo -= | sed 's/[\=\-]//g'
>
Run Code Online (Sandbox Code Playgroud)

但这不是:

>echo -= | sed 's/[\-\=]//g'
>-
Run Code Online (Sandbox Code Playgroud)

为什么??

Eta*_*ner 6

在字符类的-可用于创建一个范围(例如[A-Z],其是从所有字符AZ,而不是三个字符A,-Z).

因此当你写[\-\=]正被看作是从范围\\=(我不认为逃避=是有意义这里).

但是当你编写[\=\-]范围解释是不可能的,因为]类的终止不能是范围的结束.

同样,如果你写了,[-\=]你就不会对该类进行范围解释.

正如我所说,虽然我不认为逃避这些角色中的任何一个都是有意义的,事实上,触发这个问题的原因是[-=]同样的,并且没有范围问题.

以类似的方式,用^在字符类的开始否定了阶级,所以如果你想有一个字面^的一类,它需要在班里第一个字符.

  • @Xufox对.`sed`是一个非常古老的正则表达式引擎,它早于PCRE之类的东西,它允许转义而不是依赖于排序. (2认同)