对于关于正则表达式的第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}'
哪个不起作用。有什么帮助吗?
提前致谢。
答案 0 :(得分:5)
如果我理解你的要求很简单
awk '/^E+D+$/' file.input
会做到这一点。
UPDATE :如果行格式包含前/后编号(使用post可选),如示例后面所示,这可能是一个可能的纯正则表达式适配(替代使用字段开关{ {1}}):
-F,
答案 1 :(得分:2)
首先,您需要正则表达式:
E
这与开头的一个或多个E
匹配,中间不是D
和D
的零个或多个字符,以及一个或多个$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}'