在grep补码中转义紧密括号字符

时间:2014-07-07 11:20:01

标签: regex grep

如何在字符类中转义闭括号字符?根据手册,要匹配文字]它应该放在列表的第一位,但我需要匹配由方括号组成的类的补充。

  

大多数元字符在括号表达式中失去了特殊含义。要包含文字,请将其放在列表中的第一位。同样,要包含一个文字^将它放在任何地方,但首先。最后,要包含一个文字 - 将它放在最后。

4 个答案:

答案 0 :(得分:8)

如何在字符类中转义闭括号字符?

]通常是POSIX character class的结尾,或者表示字符类的结尾。

如果]是该课程中的第一个字符( 可能会跟随未转义的插入符号 ),则表示该课程未结束,并且已评估作为可以在不逃避的情况下匹配的字符集的一部分。

echo "foo [22-Jun-2014 04:11:37 UTC] bar" | grep -o '\[[^]]*\]'
# [22-Jun-2014 04:11:37 UTC]

答案 1 :(得分:1)

这取决于实施。

  • grep -P模式下,您实际上可以使用[][]来匹配一个开头或结束括号的字符。
  • 一般来说,最便携的语法是转义:[\]][\[]

相关

What does the “[^][]” regex mean?

答案 2 :(得分:1)

不幸的是,zx81的解决方案无效。特别是,输入:

  

[2014年6月22日04:11:37 UTC]

grep -o '.[^[\]]*' 

失败。

根据结果,工作没有逃脱:

grep '^[[][^]]*]'

似乎grep仍然认为结束括号是第一个,即使前面有一个插入符号。

答案 3 :(得分:0)

user$ sleep 400 &
[1] 13242
user$ sleep 500 &
[2] 13253
user$ jobs
[1]-  Running                 sleep 400 &
[2]+  Running                 sleep 500 &
user$ jobs | grep "sleep 400" | grep -o ^"["[0-9][0-9]*"]"
[1]
user$ jobs | grep "sleep 500" | grep -o ^"["[0-9][0-9]*"]"
[2]

为什么这样做?

方括号被视为字符串,并且没有任何明确的转义字符,它们不是grep正则表达式特殊文字的一部分。