【问题标题】:bash regex for word with some suffixes but not one specific带有一些后缀但不是一个特定后缀的单词的 bash 正则表达式
【发布时间】:2018-02-26 12:17:09
【问题描述】:

我需要(不区分大小写)一个单词的多个变体的所有匹配项——除了一个——包括未知数。

我想要

accept
acceptance
acceptable
accepting

...但不是“接受”。一位同事在他的意思是“例外”时使用它。很多。

由于我无法预测变化(或错别字),我需要允许诸如“acceptjunk”和“acceptMacarena”之类的内容

我认为我可以通过负前瞻来完成此任务,但这并没有给出我需要的结果

grep -iE '(?!acception)(accept[a-zA-Z]*)[[:space:]]' file

诀窍是,如果其他词匹配,我可以接受(har)包含“接受”的行。例如这条线没问题可以匹配:

对必然的接受就是接受

...否则到现在我已经通过 grep -v 管道 grep 并完成了它:

grep -iE '(accept)[a-zA-Z]*[[:space:]]' | grep -vi 'acception'

我找到了some questions that are similar 和许多并非如此。在grep -i 中使用a-zA-Z 可能是不必要的,但我正在挣扎。我可能错过了一些小的或基本的东西......但我仍然错过了它。这是什么?

感谢阅读。

PS:我没有嫁给 grep——但我在 bash 中操作——所以如果有一个神奇的 awk 命令可以做到这一点,我会全神贯注。

PPS:忘了提到在https://regex101.com/ 上,上面的前瞻似乎有效,但它不适用于我的完整 grep 命令。

【问题讨论】:

  • missing something small or basic grep 不支持环视...除非您有 GNU grep 支持 -P...
  • 没错。我是电影中的那个人,在英雄活着之前就死了。谢谢 Sundeep。

标签: regex bash grep


【解决方案1】:

要使用环视,您需要 GNU grep 并提供 PCRE

grep -iP '(?!acception)(accept[a-z]*)[[:space:]]'


使用awk,这可能会起作用

awk '{ip=$0; sub(/acception/, ""); if(/accept[a-zA-Z]*[[:space:]]/) print ip}'
  • ip=$0保存输入行
  • sub(/acception/, "")删除不需要的词,可以交替添加其他不需要的词
  • if(/accept[a-zA-Z]*[[:space:]]/) print ip 然后打印该行,如果它仍然包含正在搜索的单词

【讨论】:

  • 完美;谢谢你!将E更改为P就可以了。糟糕的是几周前我将 PCRE 用于其他用途。它是尚未完全致力于长期知识的短期记忆。现在它有了。 :,/
  • 有什么原因我不想改变我的习惯并从grep -E永久切换到始终使用grep -P吗?除了“某些系统不支持 PCRE”我的意思是?
  • 我能想到的一个原因是grep -E 在许多情况下会更快.. 而grep -P 如果涉及反向引用通常会更快...然后其他事情像grep -P如果 GNU grep 或 PCRE lib 不可用,则不可移植..
猜你喜欢
  • 1970-01-01
  • 2017-02-05
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多