我试图在第一个]
出现之前匹配/输出所有文字:
sed -i -r 's/^([^\]]*).*/\1/' "$FILE.tmp"
令人惊讶地无效。
但是,搜索其他括号确实有效:
sed -i -r 's/^([^\[]*).*/\1/' "$FILE.tmp"
这是一个sed错误还是我做错了?
我知道我可以使用.*?
来解决这个问题,这已经足够好了但是这个问题让我感到很难过,以至于我想知道我是否遗漏了一些东西。
(根据--version,我使用的是GNU sed 4.2.2。)
答案 0 :(得分:3)
您不需要引用结束括号]
。实际上,您的正则表达式被解析为[^\]
,后跟一个迷路]
。
您想使用以下正则表达式(请注意缺少\
的引号):
sed -i -r 's/^([^]].*).*/\1/' "$FILE.tmp"
第二个正则表达式偶然起作用,因为[
在[]
表达式中没有特殊含义,但您会发现它也匹配以\
开头的行。
事实上,在]
群组中使用[]
时,它必须是第一个字符,如果第一个字符是^
,则为第二个字符。
答案 1 :(得分:2)
应该是:
sed -r 's/^([^]]+).*/\1/'
请注意,如果]
出现在字符组中,则不需要引用它。