1

我需要做一个 grep 排除包含“这是一个句子 [WARN]”的句子,例如:

aaaabbbbcccc这是一个句子[WARN]ccccdddd

但是当我这样做时:

grep 警告日志/* | grep -v -E '这是一个句子 [WARN]'

它不起作用。我认为这是因为“[”和“]”,因为如果我这样做:

grep 警告日志/* | grep -v -E '这是一个句子'

有用。如何排除包含方括号的句子?

编辑:

对不起,我应该说 - 该字符串实际上是一个子字符串。所以我可能有:

aaaabbbbcccc这是一个句子[WARN]ccccdddd

需要排除的。

4

2 回答 2

3

-E用于扩展正则表达式。只需避开[]括号,你应该会很好。

grep WARN log/* | grep -v -E 'This is a sentence \[WARN\]'

[]括号表示未转义时的字符类,因此您的模式实际查找的是以下子字符串之一:

  • 这是一个句子W
  • 这是一个句子A
  • 这是一个句子R
  • 这是一个句子N
于 2013-10-29T10:28:16.080 回答
2

您需要告诉 grep 将该字符串用作固定字符串。为此,您可以使用-F

grep WARN log/* | grep -v -F 'This is a sentence [WARN]'

来自man grep

-F,--固定字符串

将 PATTERN 解释为固定字符串的列表,由换行符分隔,其中任何一个都将被匹配。(-F 由 POSIX 指定。)

测试

$ cat a
This is a sentence [LOG]
This is a sentence [WARN]
$ grep -v "sentence [LOG]" a   <---- [LOG] is taken as regex
This is a sentence [LOG]
This is a sentence [WARN]
$ grep -Fv "sentence [LOG]" a   <---- [LOG] is taken literally
This is a sentence [WARN]

或使用更新的输入:

$ cat a
aaaabbbbccccThis is a sentence [WARN]ccccdddd
aaaabbbbccccThis is a sentence [LOG]ccccdddd
hello!
$ grep -vF "sentence [WARN]" a
aaaabbbbccccThis is a sentence [LOG]ccccdddd
hello!
于 2013-10-29T10:23:33.807 回答