![sed 的正则表达式字符类(例如 [abc])中的顺序重要吗?](https://linux22.com/image/168115/sed%20%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%AD%97%E7%AC%A6%E7%B1%BB%EF%BC%88%E4%BE%8B%E5%A6%82%20%5Babc%5D%EF%BC%89%E4%B8%AD%E7%9A%84%E9%A1%BA%E5%BA%8F%E9%87%8D%E8%A6%81%E5%90%97%EF%BC%9F.png)
我想最好从一个例子开始:
> 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 中无效?)。