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

How can I get a list of the words that have six or more consonants in a row using the grep command?

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

我是 Unix 终端的新手,但这是我尝试过的:

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

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

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

更长的命令

您可以使用

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\}

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

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

I use the cat command here because it will otherwise include the file names in the next pipe

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

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

使用这个 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 switches
perldoc perlre: Perl regular expressions (regexes)
perldoc perlre: Perl regular expressions (regexes): Quantifiers; Character Classes and other Special Escapes; Assertions; Capture groups
perldoc perlrequick: Perl regular expressions quick start

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

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

我们可以使用grep -Eo(-E Extended regex, -o output ONLY matching)

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

我们可以使用 Regex 来搜索包含模式的字符串:

  1. [^LISTOFCHARACTERS] 除了 LISTOFCHARACTERS
  2. 之外的任何字符
  3. {6,} 6 个或更多