如何找到包含“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”结尾的单词? (重击正则表达式)的主要内容,如果未能解决你的问题,请参考以下文章