Grep Regex排除特殊字符

时间:2015-07-02 16:30:36

标签: regex grep

我很难尝试搜索短语,但如果短语后面直接跟冒号空格,则排除短语。

我在寻找Delet! (即" Delet。*"在正则表达式语法中)但我不希望返回任何"已删除:" (包括冒号后的空格)。但是,我想要回复的是#34;已删除"其次是结肠空间以外的任何东西。

我尝试过以下表达式

grep -ri 'delet.*[^:]'

grep -ri 'delet[a-zA-Z0-9\;\".....]{0,10}'

(包括转义前面的范围内的所有特殊字符)

4 个答案:

答案 0 :(得分:0)

如果我找到了你,你想要的任何内容都以delet开头,而不是以deleted:开头:

grep -Ei '^delet((([^e]|e$)|e([^d]|d$)|ed([^:]|:$)|ed:[^ ]).*)?$'

这基本上说:

  • 匹配[start]deletX[anything][end][start]delete[end],其中X不是e
  • 匹配[start]deleteX[anything][end][start]deleted[end],其中X不是d
  • 匹配[start]deletedX[anything][end][start]deleted:[end],其中X不是:
  • 匹配[start]deleted:X[anything][end] X不是空格。

如果适用,那么使用管道和第二个负面grep要容易得多:

grep -i ^delet | grep -vi '^deleted: '

答案 1 :(得分:0)

使用超前表达式:

grep -Pi 'Delet(?!ed: )'

请注意,修改grep-P的参数可以使用超前表达式。

答案 2 :(得分:0)

试试这个。 ?之后的*指示它选择尽可能少的非空格字符,后跟任何一个不是冒号的字符,后跟一个空格。

grep -ri 'delet[^ ]*?[^:] '

答案 3 :(得分:0)

听起来你只需要:

awk -v IGNORECASE=1 '/delet/ && !/deleted: /' file

以上使用GNU awk进行IGNORECASE,其他awk将使用tolower()。

awk优于grep的好处是awk测试条件,而不仅仅是regexp,因此你可以使用&&||创建复合条件,从而使regexp更加简单明了只编码您要测试的条件 - 该行包含delet和(&&)而不是!deleted: