Gawk regexp选择序列

时间:2015-11-11 20:40:17

标签: regex gawk

对于关于正则表达式的第n个简单问题感到抱歉但是如果没有我认为太复杂的解决方案,我就无法得到我需要的东西。我正在解析一个包含3个字母A,E,D序列的文件,如

AADDEEDDA

EEEEEEEE

AEEEDEEA

AEEEDDAAA

我想仅识别那些以E开头且以D结尾且序列中只有一处变化的内容,例如在

EDDDDDDDD

EEEDDDDDD

EEEEEEEED

我正在与正确的正则表演斗争。这是我最后的尝试

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}'

哪个不起作用。有什么帮助吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

如果我理解你的要求很简单

awk '/^E+D+$/' file.input

会做到这一点。

UPDATE :如果行格式包含前/后编号(使用post可选),如示例后面所示,这可能是一个可能的纯正则表达式适配(替代使用字段开关{ {1}}):

-F,

答案 1 :(得分:2)

首先,您需要正则表达式:

E

这与开头的一个或多个E匹配,中间不是DD的零个或多个字符,以及一个或多个$2 ~ /^E+[^ED]*D+$/ s最后。

然后你的AWK程序看起来像

$2

~是指当前记录的第二个字段,/是正则表达式匹配运算符,{是分隔正则表达式。这些组件一起构成了AWK术语中已知的"模式",它相当于输入记录的布尔过滤器。请注意,没有"动作" (此处指定的{ print $0 } s)中的一系列陈述。这是因为当没有指定任何动作时,AWK假定动作应为{{1}},这将打印整行。

答案 2 :(得分:1)

如果我理解你是正确的,你想要匹配以至少一个E开头的模式,然后继续至少一个D直到结束。

echo "1,AAEDDEED,1\n2,EEEEDDDD,2\n3,EDEDEDED" | gawk -F, '{if($2 ~ /^E+D+$) print $0}'