我很难尝试搜索短语,但如果短语后面直接跟冒号空格,则排除短语。
我在寻找Delet! (即" Delet。*"在正则表达式语法中)但我不希望返回任何"已删除:" (包括冒号后的空格)。但是,我想要回复的是#34;已删除"其次是结肠空间以外的任何东西。
我尝试过以下表达式
grep -ri 'delet.*[^:]'
grep -ri 'delet[a-zA-Z0-9\;\".....]{0,10}'
(包括转义前面的范围内的所有特殊字符)
答案 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:
。