如何匹配特定长度的单词(比如说五个)?
给出文本的输入文件temp
:
1) ci sono quattro mele
2) sentiamoci il 16 ottobre 2018
3) decidiamo il 17 ottabre 2017
4) Manipolo di eroi
5) 17 mele
6) 18 ott 2020
7) una mela e mezza
8) 2 mele
如果我这样做:
awk '/[[:lower:]]{5}/ {print}' temp
我希望句子7)
作为输出,因为这是唯一一个长度为5
(mezza
)的单词。实际上,它返回的行的长度等于或大于5
。
此行为与我咨询的任何信息源均不兼容:
构造{n}
应该精确匹配n
次。在这一点上,恐怕我缺少明显的东西。
答案 0 :(得分:3)
之所以匹配,是因为它在较长的字符串中找到了5个小写字母的字符串。您需要调整您的正则表达式,以使“单词”匹配被空白包围。别忘了还要在“单词”边界中处理字符串的开头/结尾。
答案 1 :(得分:2)
结构{n} 确实匹配了n次,您所缺少的是一个7个字母的单词内有5个字母,因此匹配{5}。您还需要指定在这5个字母之前或之后的内容,以免出现部分匹配。
对于单词边界\<
和\>
和\w
使用GNU awk作为单词组成字符:
$ awk '/\<\w{5}\>/' file
7) una mela e mezza
任何awk:
$ awk '/(^|[^[:alpha:]])[[:alpha:]]{5}([^[:alpha:]]|$)/' file
7) una mela e mezza
这些解决方案和其他解决方案显然将取决于您所说的“单词”的含义。
答案 2 :(得分:1)
如果它总是被空格包围,则可以执行以下操作
[[:lower:]]{5}\s+
或\s+[[:lower:]]{5}\s+
(取决于您想做什么)
答案 3 :(得分:1)
由于您拥有awk
的全部功能,为什么要限制自己进行正则表达式匹配?
$ awk -v RS='[ \n]' 'length($0)==5' file
mezza
答案 4 :(得分:1)
grep -P '(?<![[:lower:]])[[:lower:]]{5}(?![[:lower:]])' temp
Unix示例
7) una mela e mezza
结果
perl -ne 'print if /(?<![[:lower:]])[[:lower:]]{5}(?![[:lower:]])/' temp
Perl示例(相同的输出)-ty @Ed Morton
AuthenticatorActivity