grep一系列N到N个令牌

时间:2016-03-06 15:02:23

标签: regex bash grep

我想grep(我可以接受非grep的答案,但这是我最常用的)这些行有一系列由空格分隔的标记,并且能够忽略标点符号。这意味着如果我想要三到五个令牌,我会得到三个,四个或五个令牌,但不是一个,两个,六个或二十个令牌。我有句号结尾,有时候中间有逗号,如果可能的话,我想说明的事情。此外,真实数据实际上是单词,所以我想要一个明确的说明,允许不一定是a-zA-Z的字符,例如单词" can' t"。

我的数据是这样的:

aa .
aa bb'b , c ddd e f gg .
aa bb .
aaa bb'b cccc dddd e .
aaaa bb'b cccc , dddd .
aa bb'b cc dd e f .
aaaaa bb'b c .

我试过了:

grep -e "[a-zA-Z']* ,*\{3,5\}"

我期望得到的是:

aaa bb'b cccc dddd e .
aaaa bb'b cccc , dddd .
aaaaa bb'b c .

4 个答案:

答案 0 :(得分:2)

我认为可以使这项任务变得简单,因为它有一个变量NF来计算每行中的字段数(用空格分隔),所以:

awk 'NF >= 4 && NF <= 6' infile

我增加了它的值以考虑上一个时期。它产生:

a b c d e .
a b c d .
a b c .

编辑:要忽略逗号,请将FS变量(字段分隔符)与正则表达式一起使用:

awk 'BEGIN { FS = "[[:blank:],]+" } NF >= 4 && NF <= 6' infile

它产生:

aaa bb'b cccc dddd e .
aaaa bb'b cccc , dddd .
aaaaa bb'b c .

答案 1 :(得分:2)

使用GNU grep:

grep -E "^([a-zA-Z']+ *,* ){3,5}\.$" file

输出:

aaa bb'b cccc dddd e .
aaaa bb'b cccc , dddd .
aaaaa bb'b c .

答案 2 :(得分:1)

以下是添加到混音中的一个示例:

sed -n "/^\([a-zA-Z',]* \)\{3,5\}\.$/p"

<强>输出:

aaa bb'b cccc dddd e .
aaaa bb'b cccc , dddd .
aaaaa bb'b c .

答案 3 :(得分:0)

另一种可能性:

awk '/aaa+/' file
aaa bb'b cccc dddd e .
aaaa bb'b cccc , dddd .
aaaaa bb'b c .