很抱歉在regexp上出现了第n个简单的问题,但是如果没有一个在我看来太复杂的解决方案,我就不能得到我需要的东西。我正在解析一个只包含3个字母A、E、D的文件,如下所示
AADDEEDDA
EEEEEEEE
AEEEDEEA
AEEEDDAAA
我只想识别那些以E开头,以D结尾的序列,序列中只有一个变化,例如
EDDDDDDDD
EEEDDDDDD
EEEEEEEED
我正在使用适当的regexp来实现这一点。这是我的最后一次尝试
echo "1,AAEDDEED,1\n2,EEEEDDDD,2\n3,EDEDEDED" | gawk -F, '{if($2 ~ /^E[(ED){1,1}]*D$/ && $2 !~ /^E[(ED){2,}]*D$/) print $0}'
这不起作用。有什么帮助吗?
提前谢谢。
发布于 2015-11-12 05:09:53
如果我没理解错的话,你的要求很简单
awk '/^E+D+$/' file.input就能达到目的。
UPDATE:如果行格式包含pre/post数字( post可选),如后面的示例所示,这可能是一种纯粹的正则表达式调整(替代使用字段开关-F,):
awk '/^[0-9]+,E+D+(,[0-9]+)?$/' input.test发布于 2015-11-12 05:29:29
首先,您需要正则表达式:
^E+[^ED]*D+$这将匹配开头的一个或多个E,中间既不是E也不是D的零个或多个字符,以及结尾的一个或多个D。
然后你的AWK程序看起来就像
$2 ~ /^E+[^ED]*D+$/$2是指当前记录的第二个字段,~是正则表达式匹配操作符,/是正则表达式的分隔符。这些组件共同构成了AWK术语中所说的“模式”,相当于输入记录的布尔过滤器。请注意,这里没有指定“操作”({中的一系列语句)。这是因为当没有指定操作时,AWK假设操作应该是{ print $0 },它会打印整行。
发布于 2015-11-12 05:11:29
如果我理解正确的话,您希望匹配的模式以至少一个E开头,然后以至少一个D开头,直到最后。
echo "1,AAEDDEED,1\n2,EEEEDDDD,2\n3,EDEDEDED" | gawk -F, '{if($2 ~ /^E+D+$) print $0}'https://stackoverflow.com/questions/33659423
复制相似问题