我需要做一个grep,它排除包含'这是一个句子[WARN]'的句子,例如:
aaaabbbbcccc这是一句话[WARN] ccccdddd
但是当我这样做时:
grep WARN log / * | grep -v -E'这是一个句子[WARN]'
它不起作用。我认为这是因为“[”和“]”因为如果我这样做:
grep WARN log / * | grep -v -E'这是一个句子'
它有效。如何排除包含方括号的句子?
修改
对不起,我应该说 - 字符串实际上是一个子字符串。所以我可能有:
aaaabbbbcccc这是一句话[WARN] ccccdddd
需要排除。
答案 0 :(得分:2)
-E
用于扩展正则表达式。只是逃避[]
括号,你应该很好。
grep WARN log/* | grep -v -E 'This is a sentence \[WARN\]'
[]
括号表示未转义时的字符类,因此您的模式实际需要的是以下子字符串之一:
答案 1 :(得分:1)
你需要告诉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!