Regex 匹配特定长度的单词

Regex 匹配特定长度的单词,regex,awk,Regex,Awk,我如何匹配一个特定长度的单词,比如说,五个 给定文本的输入文件温度: 如果我这样做: awk '/[[:lower:]]{5}/ {print}' temp 我希望输出句子7,因为它是唯一一个单词长度为5夹层的句子。实际上,它返回每一行长度等于或大于5的单词 此行为与我咨询的任何信息源都不兼容: 构造{n}应该正好匹配n次。在这一点上,我恐怕遗漏了一些明显的东西 它是匹配的,因为它在长度较长的字符串中找到了一个由5个小写字母组成的字符串。您需要调整正则表达式,以便单词match被空格包围。不要

我如何匹配一个特定长度的单词,比如说,五个

给定文本的输入文件温度:

如果我这样做:

awk '/[[:lower:]]{5}/ {print}' temp
我希望输出句子7,因为它是唯一一个单词长度为5夹层的句子。实际上,它返回每一行长度等于或大于5的单词

此行为与我咨询的任何信息源都不兼容:


构造{n}应该正好匹配n次。在这一点上,我恐怕遗漏了一些明显的东西

它是匹配的,因为它在长度较长的字符串中找到了一个由5个小写字母组成的字符串。您需要调整正则表达式,以便单词match被空格包围。不要忘了在单词边界中指定字符串的开头/结尾。

它是匹配的,因为它在长度较长的字符串中找到了一个由5个小写字母组成的字符串。您需要调整正则表达式,以便单词match被空格包围。不要忘了在单词边界中指定字符串的开头/结尾。

如果字符串总是被空格包围,可以执行以下操作 [[:lower:]{5}\s+或\s+[[:lower:]{5}\s+
根据您要执行的操作

如果它总是被空格包围,您可以执行以下操作 [[:lower:]{5}\s+或\s+[[:lower:]{5}\s+ 取决于你想做什么

构造{n}确实匹配n次,你缺少的是一个有7个字母的单词里面有5个字母,因此匹配{5}。您需要指定这5个字母前面和后面的内容,以避免类似的部分匹配

GNU awk表示单词边界,\w表示单词组成字符:

$ awk '/\<\w{5}\>/' file
7) una mela e mezza
这些和任何其他解决方案显然取决于一个单词的含义。

构造{n}确实匹配了n次,但缺少的是一个包含7个字母的单词中有5个字母,因此匹配{5}。您需要指定这5个字母前面和后面的内容,以避免类似的部分匹配

GNU awk表示单词边界,\w表示单词组成字符:

$ awk '/\<\w{5}\>/' file
7) una mela e mezza

这些和任何其他解决方案显然取决于您所说的单词的含义。

既然您拥有awk的全部功能,为什么要将自己限制为正则表达式匹配

$ awk -v RS='[ \n]' 'length($0)==5' file

mezza

既然您拥有awk的全部功能,为什么只使用正则表达式匹配呢

$ awk -v RS='[ \n]' 'length($0)==5' file

mezza
?

找5个更低的 使用“反向查找”获取边界(&B) Unix示例

Perl示例相同的输出-ty@Ed Morton

perl -ne 'print if /(?<![[:lower:]])[[:lower:]]{5}(?![[:lower:]])/' temp
?

找5个更低的 使用“反向查找”获取边界(&B) Unix示例

Perl示例相同的输出-ty@Ed Morton

perl -ne 'print if /(?<![[:lower:]])[[:lower:]]{5}(?![[:lower:]])/' temp

Awk在我熟悉的任何版本中都不支持\s。@tripleee GNU Awk支持。这是唯一一个AFAIK,但当然GNU awk也支持单词边界,这在本例中可能是更合适的构造。njank-您的regexp中的+s没有做任何有用的事情,您可以删除它们。Awk在我熟悉的任何版本中都不支持\s。@tripleee GNU Awk支持。这是唯一一个AFAIK,但当然GNU awk也支持单词边界,这在本例中可能是更合适的构造。njank-您的regexp中的+s没有做任何有用的事情,您可以将它们删除。因此^ |[:space:][:lower:]{5}[:space:].$或可能还包括数字、标点符号和/或边界条件中的大写字母。因此^[:space:][:lower:]{5}[:space:].$或可能还包括数字、标点符号,和/或边界条件中的大写字母。可能会找到更好的副本;这绝对是一个常见的常见问题。你需要单词边界。就是这样。也许有可能找到更好的复制品;这绝对是一个常见的常见问题。你需要单词边界。就是这样。RS='[[:space:]+'将包括空格、换行符和制表符等。因此,例如,如果一个文件包含5个连续的制表符,它不会失败。如果文件包含5位数字或否,它可能仍然会失败;但这完全取决于OP的一个词的意思。据我们所知,没有;on和12345都是OP的单词;我认为使用RS意味着添加其他单词分隔符chars\t;等等。是的,也许吧,idk。使用RS='[:alpha:]+'和lengthRT==5也可能是合理的,因为多字符RS需要GNU awk,而RT是可用的。但是,另一个问题是OP需要整行输出:我希望输出句子7,因为它是唯一一个单词长度为5的句子,如果您丢失了行尾,您就不能这样做。RS='[[:space:][]+'将包括空格、换行符和制表符等。例如,如果一个文件包含5个连续的选项卡,它不会失败。如果文件包含5位数字或否,它可能仍然会失败;但这完全取决于OP的一个词的意思。据我们所知,没有;on和12345都是OP的单词;我认为使用RS意味着添加其他单词分隔符chars\t;等我们
是的,也许吧,艾德克。使用RS='[:alpha:]+'和lengthRT==5也可能是合理的,因为多字符RS需要GNU awk,而RT是可用的。但另一个问题是OP需要整行输出:我希望第7句作为输出,因为这是唯一一个单词长度为5的句子,如果你丢失了行尾,你就不能这样做。@EdMorton我编辑了答案,给出了一个grep解决方案。或者我错认为grep是一个标准的UNIX工具了吗?它更好,但是grep-P只在非标准的、仅GNU版本的grep中可用,甚至说这是一个高度实验性的版本,而且有报道说它的核心被转储了。cat文件| grep'regexp'是一个,顺便说一句-使用grep'regexp'文件代替。@EdMorton不知道,谢谢:不客气。人们确实使用grep-P,但我不知道为什么,因为如果您可以使用GNU grep,那么您就不局限于只使用POSIX工具,然后您就可以使用perl,而不存在高度实验性的问题。您也不需要使用PCREs,您可以随时使用标准工具(如grep/sed/awk)理解的其他ERE表达您的需求。就个人而言,如果开发工具的人告诉我它是高度实验性的,我不需要使用它,那就足够好了,我可以远离它@EdMorton添加了一个perl示例:-我希望这也不是高度实验性的:D@EdMorton我编辑了答案以给出grep解决方案。或者我错认为grep是一个标准的UNIX工具了吗?它更好,但是grep-P只在非标准的、仅GNU版本的grep中可用,甚至说这是一个高度实验性的版本,而且有报道说它的核心被转储了。cat文件| grep'regexp'是一个,顺便说一句-使用grep'regexp'文件代替。@EdMorton不知道,谢谢:不客气。人们确实使用grep-P,但我不知道为什么,因为如果您可以使用GNU grep,那么您就不局限于只使用POSIX工具,然后您就可以使用perl,而不存在高度实验性的问题。您也不需要使用PCREs,您可以随时使用标准工具(如grep/sed/awk)理解的其他ERE表达您的需求。就个人而言,如果开发工具的人告诉我它是高度实验性的,我不需要使用它,那就足够好了,我可以远离它@EdMorton添加了一个perl示例:-我希望这也不是高度实验性的:D
perl -ne 'print if /(?<![[:lower:]])[[:lower:]]{5}(?![[:lower:]])/' temp