如何使用 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 个单词(the
、abcdfghi
、aBcdfghi
)匹配。这对于某些应用程序可能很重要。 请注意,并非此线程中的所有答案都使用字母周围的单词边界,因此不要在此示例中进行区分。
/[^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 命令获取连续有六个或更多辅音的单词列表?的主要内容,如果未能解决你的问题,请参考以下文章