如何使用 grep 命令获取连续有六个或更多辅音的单词列表?

Posted

技术标签:

【中文标题】如何使用 grep 命令获取连续有六个或更多辅音的单词列表?【英文标题】:How can I get a list of the words that have six or more consonants in a row using the grep command? 【发布时间】:2021-03-03 21:23:22 【问题描述】:

我想从多个文本文件中查找连续包含六个或更多辅音的单词列表。

我对 Unix 终端很陌生,但这是我尝试过的:

cat *.txt | grep -Eo "\w+" | grep -i "[^AEOUIaeoui]6"

我在这里使用 cat 命令,因为否则它将在下一个管道中包含文件名。我使用第二个管道来获取文本文件中所有单词的列表。

问题是最后一个管道,我想以某种方式让它连续 grep 6 个辅音,它不需要是同一个。我知道解决问题的一种方法,但这会创建一个比整个帖子更长的命令。

【问题讨论】:

grep 不打印文件名,如果你使用-h 开关。 如果您能提供一个示例输入和输出,那就太好了,这样我们就可以更好地了解您在寻找什么 【参考方案1】:

获取给定目录中连续包含6个或更多辅音的所有单词

cat *.txt | grep -Eo "\w+" | grep -E "[^AEOUIaeoui]6,"

我们可以使用grep -Eo(-E 扩展正则表达式,-o 仅输出匹配)

cat *.txt会输出当前目录下所有txt文件的所有数据grep -Eo "\w+"会以每行一个单词的形式输出输入的所有单词

我们可以使用正则表达式来搜索包含模式的字符串:

    [^LISTOFCHARACTERS] 除 LISTOFCHARACTERS 以外的任何字符 6, 6 个或更多

【讨论】:

【参考方案2】:

使用这个 Perl 单行代码:

perl -lne 'print for grep  /[^aeoui]6/i  /\b([a-z]+)\b/ig' in_file.txt

例子:

cat > in_file.txt <<EOF
the abcdfghi aBcdfghi.
ABCDFGHI234
abcdEfgh
EOF
perl -lne 'print for grep  /[^aeoui]6/i  /\b([a-z]+)\b/ig' in_file.txt

输出:

abcdfghi
aBcdfghi

Perl 单行程序使用这些命令行标志:-e:告诉 Perl 查找内联代码,而不是在文件中。-n:循环输入一行一次,默认将其分配给$_-l:在执行内联代码之前剥离输入行分隔符(默认为 *NIX 上的"\n"),并在打印时附加它。

正则表达式使用以下修饰符:/g:多个匹配项。/i:不区分大小写的匹配项。

/\b([a-z]+)\b/ig :匹配仅包含 1 个或多个字母的单词 ([a-z]+),两边都有单词边界 \b。这样,ABCDFGHI234 不匹配,但第 1 行中的所有 3 个单词(theabcdfghiaBcdfghi)匹配。这对于某些应用程序可能很重要。 请注意,并非此线程中的所有答案都使用字母周围的单词边界,因此不要在此示例中进行区分。

/[^aeoui]6/i :匹配 6 个或更多连续的非元音。此处的非元音完全解析为辅音,因为前面的正则表达式仅针对由字母组成的单词,即元音和辅音。

另请参阅:perldoc perlrun: how to execute the Perl interpreter: command line switchesperldoc perlre: Perl regular expressions (regexes)perldoc perlre: Perl regular expressions (regexes): Quantifiers; Character Classes and other Special Escapes; Assertions; Capture groupsperldoc perlrequick: Perl regular expressions quick start

【讨论】:

【参考方案3】:

对于最后一个 grep,您还需要 -E 开关 - 或者您需要转义花括号:

cat *.txt | grep -Eo "\w+" | grep -Ei "[^AEOUIaeoui]6"
cat *.txt | grep -Eo "\w+" | grep -i "[^AEOUIaeoui]\6\"

我在这里使用 cat 命令,否则它将在下一个管道中包含文件名

您可以使用-h 标志禁用此功能:

grep -hEo "\w+" *.txt | grep -Ei "[^AEOUIaeoui]6"

【讨论】:

【参考方案4】:

你可以使用

grep -hEio '[[:alpha:]]*[b-df-hj-np-tv-z]6[[:alpha:]]*' *.txt

正则表达式详细信息

[[:alpha:]]* - 任何零个或多个字母 [b-df-hj-np-tv-z]6 - 六个英文辅音字母结束 [[:alpha:]]* - 任何零个或多个字母。

grep 选项使正则表达式搜索不区分大小写 (i),grep 仅显示匹配的文本 (o) 不显示文件名 (h)。 -E 选项允许使用 POSIX ERE 语法,否则,如果您不指定它,则需要将 6 转义为 \6\

【讨论】:

为什么我们需要[[:alpha:]]*前后? @Philippe 匹配任何零个或多个字母。 @Philippe 查看online grep demo 了解为什么[[:alpha:]]* 在这里很重要。

以上是关于如何使用 grep 命令获取连续有六个或更多辅音的单词列表?的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - 用 pyspark 中的第一个单词替换 2 个或更多连续单词

JavaScript 构建选项/工具

如何在 PHP 中以 2 个或多个连续空格分割字符串

Python2(有六个)元类和带参数的字段

杜克大学有六个伦理委员会,看看它是如何架构设计和日常运行的

获取具有2个或更多条件的foreach循环的值