否定正则表达式的一部分

时间:2016-09-24 22:47:22

标签: regex linux grep

我正在寻找一种匹配方式(伪代码)

User

其中grep -E '^[aoueiy]*(!sch|s|z)+.*$' 不匹配

它应与!sabczabc匹配,但不能与as匹配。

如何用grep以正确的方式写这个?

3 个答案:

答案 0 :(得分:1)

您可以使用grep -E分两步执行此操作:

grep -E '^[aeiouy]*(s|z)+' infile | grep -vE '^[aeiouy]*(sch)+'

第一遍获得所有期望的匹配以及不期望的usch样式匹配;第二遍删除了不受欢迎的那些。

对于包含

的输入文件
sabc
zabc
as
usch

输出

$ grep -E '^[aeiouy]*(s|z)+' infile | grep -vE '^[aeiouy]*(sch)+'
sabc
zabc
as

或者,建立在redneb's answer上,使用grep -P 1 和否定前瞻:

$ grep -P '^[aeiouy]*(?!sch)[sz]+' infile
sabc
zabc
as

1 请注意,-P选项需要GNU grep。

答案 1 :(得分:1)

我不确定你的意思:

grep -E '^[aoueiy]*(!sch|s|z)+.*$'

但不管它是什么,只需使用awk。例如,这是对上述命令可能意味着什么的一种解释:

awk '/^[aoueiy]*[sz]/ && !/^[aoueiy]*sch/'

或使用GNU awk为第3个arg匹配()以删除^[aoueiy]*的冗余规范:

awk 'match($0,/^[aoueiy]*([sz].*)/,a) && (a[1] !~ /^sch/)'

答案 2 :(得分:0)

如果您在-P中使用grep模式,那么您可以使用如下的否定前瞻:

grep -P '^[aoueiy]*(?!sch|s|z).*$'

如果[aoueiy]*schs之一没有z,则会在行的开头匹配.*$

另请注意,正则表达式末尾的grep -P '^[aoueiy]*(?!sch|s|z)' 是多余的,因此您可以这样做:

SELECT m.*, (@rn := @rn + 1) as rank
FROM Mannen m CROSS JOIN
     (SELECT @rn := 0) params
ORDER BY Lichaamsgewicht DESC;