我想最好从一个例子开始:
> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\:\-]+(.*)$/\1/'
]Something
> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\-\:]+(.*)$/\1/'
-20:10]Something
唯一的区别是我交换了正则表达式字符类中的:
和字符。-
那么:在 sed 的正则表达式的字符类中,字符的顺序重要吗?我似乎在不同的正则表达式系统上并不重要,比如https://regex101.com/。
我在 Google 上找不到有关此行为的任何信息,但我想了解更多,因为我想确保知道我的脚本的作用。
答案1
有一些规则。在这种情况下,重要的是这-
是一个范围操作,因此您可以说a-f
而不是abcdef
在类内部。要包含 a-
作为文字字符,如果它是类中的最后一个字符,则最简单,但它可以是范围的第一个或任一端。
如果你想否定一组字符,那么第一个字符必须是^
。要将其作为文字包含在内,那么它一定不能是第一个。
当]
类结束时,有一种特殊情况,允许它成为第一个(如果第一个字符要^
否定该类,则为第二个),[]abc]
一组 4 个字符a
b
c
或 也是如此]
。
答案2
是的,这很重要,因为[0-9\:\-]
匹配数字、反斜杠、冒号或破折号中的任何单个字符,而不[0-9\-\:]
匹配破折号。在第二个表达式中,破折号表示反斜杠字符和反斜杠字符之间的范围(反斜杠是文字,是字符类),并且该表达式相当于[0-9\:]
(or, 就此而言[\0-9:]
)。
破折号确实不是^
如果它是字符类中的第一个(可能在 后面)或最后一个,则表示一系列字符。
另请注意,它sed
处理 POSIX 正则表达式,我认为您链接到的网站不明确支持该表达式(请参阅为什么我的正则表达式在 X 中有效但在 Y 中无效?)。