我想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 .
答案 0 :(得分:2)
我认为awk可以使这项任务变得简单,因为它有一个变量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 .