我正在寻找一种匹配方式(伪代码)
User
其中grep -E '^[aoueiy]*(!sch|s|z)+.*$'
不匹配
它应与!
,sabc
和zabc
匹配,但不能与as
匹配。
如何用grep以正确的方式写这个?
答案 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]*
,sch
,s
之一没有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;