Sed:为什么[^ \]]似乎不起作用?

时间:2016-02-08 16:57:19

标签: regex linux sed

我试图在第一个]出现之前匹配/输出所有文字:

sed -i -r 's/^([^\]]*).*/\1/' "$FILE.tmp"

令人惊讶地无效。

但是,搜索其他括号确实有效:

sed -i -r 's/^([^\[]*).*/\1/' "$FILE.tmp"

这是一个sed错误还是我做错了?

我知道我可以使用.*?来解决这个问题,这已经足够好了但是这个问题让我感到很难过,以至于我想知道我是否遗漏了一些东西。

(根据--version,我使用的是GNU sed 4.2.2。)

2 个答案:

答案 0 :(得分:3)

您不需要引用结束括号]。实际上,您的正则表达式被解析为[^\],后跟一个迷路]

您想使用以下正则表达式(请注意缺少\的引号):

sed -i -r 's/^([^]].*).*/\1/' "$FILE.tmp"

第二个正则表达式偶然起作用,因为[[]表达式中没有特殊含义,但您会发现它也匹配以\开头的行。

事实上,在]群组中使用[]时,它必须是第一个字符,如果第一个字符是^,则为第二个字符。

答案 1 :(得分:2)

应该是:

sed -r 's/^([^]]+).*/\1/'

请注意,如果]出现在字符组中,则不需要引用它。