如何找到包含“a”并且以“d”结尾的单词? (重击正则表达式)

Posted

技术标签:

【中文标题】如何找到包含“a”并且以“d”结尾的单词? (重击正则表达式)【英文标题】:how to find a word that contain "a" and also end with "d"? (Bash Regex) 【发布时间】:2022-01-12 23:58:21 【问题描述】:
  grep -E "a|d$$" filename

这是我拥有的,但它不起作用。 我可以得到一些建议我应该如何处理它吗?

【问题讨论】:

你能给出一个示例输入和所需的输出吗?你想要每个单词,每一行包含任何这样的单词,...? 不是一个很好的方法:grep -E "*a*.*d$"文件名 文件是每行一个单词,还是必须匹配行中任何位置的单词? @Riz 在正则表达式开头的 * 之类的重复元字符是未定义的行为,并且始终是错误的,因为无论您想要什么,都意味着有一种正确、明确的方式来编写它。跨度> edit 你的问题包含一个minimal reproducible example 简洁、可测试的样本输入和预期的输出,所以我们可以帮助你,因为现在你的问题有几种不同的解释,你可以用样本来澄清输入/输出。 【参考方案1】:

| 是 OR,而不是 AND。因此,您的命令返回包含 a 或以 d 结尾的行(我假设 $$$ 的拼写错误)。要顺序匹配这两个条件,只需将一个模式放在另一个模式之后,不要使用|

如果文件是每行一个单词,使用:

grep 'a.*d$' filename

如果每行有多个单词,并且您使用的是 GNU grep,您可以使用:

grep -P 'a\w*d\b' filename

\w 匹配单词字符,\b 匹配d 之后的单词边界。

这将匹配包含该单词的整行。如果您只想返回单词本身,请使用

grep -P -o '\b\w*a\w*d\b' filename

-o 选项意味着只显示与正则表达式匹配的那部分行

【讨论】:

【参考方案2】:

使用 awk:

awk 'for (i=0; i<=NF; i++) if ($i~/a.*d$/) print $i'

使用 GNU awk 或任何为记录分隔符实现正则表达式的 awk (RS):

awk -v RS='[[:space:]]+' '/a.*d$/'

使用 GNU grep:

grep -Po '[^[:space:]]*a[^[:space:]]*d(?=[[:space:]]|$)'

【讨论】:

以上是关于如何找到包含“a”并且以“d”结尾的单词? (重击正则表达式)的主要内容,如果未能解决你的问题,请参考以下文章

用于匹配单词的正则表达式,除非前一行以单词结尾

Java - 如果单词以用户输入的分隔符结尾,则执行 x

使用 sed/awk 仅打印包含匹配模式的单词 - 以 /pattern/ 开头或以 /pattern/ 结尾的单词

Shell脚本以仅包含冒号的行结尾?

正则表达式(几个例子)

如何通过给定的两个文件检索特定单词之间的行?