首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gawk regexp选择序列

Gawk regexp选择序列
EN

Stack Overflow用户
提问于 2015-11-12 04:40:17
回答 3查看 63关注 0票数 4

很抱歉在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}'

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

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-11-12 05:09:53

如果我没理解错的话,你的要求很简单

代码语言:javascript
复制
awk '/^E+D+$/' file.input

就能达到目的。

UPDATE:如果行格式包含pre/post数字( post可选),如后面的示例所示,这可能是一种纯粹的正则表达式调整(替代使用字段开关-F,):

代码语言:javascript
复制
awk '/^[0-9]+,E+D+(,[0-9]+)?$/' input.test
票数 5
EN

Stack Overflow用户

发布于 2015-11-12 05:29:29

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

代码语言:javascript
复制
^E+[^ED]*D+$

这将匹配开头的一个或多个E,中间既不是E也不是D的零个或多个字符,以及结尾的一个或多个D

然后你的AWK程序看起来就像

代码语言:javascript
复制
$2 ~ /^E+[^ED]*D+$/

$2是指当前记录的第二个字段,~是正则表达式匹配操作符,/是正则表达式的分隔符。这些组件共同构成了AWK术语中所说的“模式”,相当于输入记录的布尔过滤器。请注意,这里没有指定“操作”({中的一系列语句)。这是因为当没有指定操作时,AWK假设操作应该是{ print $0 },它会打印整行。

票数 2
EN

Stack Overflow用户

发布于 2015-11-12 05:11:29

如果我理解正确的话,您希望匹配的模式以至少一个E开头,然后以至少一个D开头,直到最后。

代码语言:javascript
复制
echo "1,AAEDDEED,1\n2,EEEEDDDD,2\n3,EDEDEDED" | gawk -F, '{if($2 ~ /^E+D+$) print $0}'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33659423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档