Regex 如何删除单行中的第二个grep匹配?

Regex 如何删除单行中的第二个grep匹配?,regex,bash,unix,grep,Regex,Bash,Unix,Grep,输入文件1 BRAF p.Gly464Val Non-small cell p.Gly464Val pathogenic BAG3 p.His83Gln AllHighlyPenetrant p.His83Gln pathogenic EYA4 p.Gly277Ser AllHighlyPenetrant p.Gly277Ser pathogenic myCmd egrep "p\.[A-Z][a-z]{1,}[0-9]

输入文件1

BRAF      p.Gly464Val  Non-small cell p.Gly464Val   pathogenic
BAG3      p.His83Gln  AllHighlyPenetrant      p.His83Gln     pathogenic 
EYA4      p.Gly277Ser  AllHighlyPenetrant     p.Gly277Ser    pathogenic
myCmd

egrep "p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}" file1
预期产出

BRAF      p.Gly464Val  Non-small cell  pathogenic
BAG3      p.His83Gln  AllHighlyPenetrant  pathogenic 
EYA4      p.Gly277Ser  AllHighlyPenetrant  pathogenic 
如何删除第二个grep匹配?如有任何建议,我们将不胜感激。

thnx

如果格式不重要:

awk '{$(NF-1)=""}1' file
BRAF p.Gly464Val Non-small cell  pathogenic
BAG3 p.His83Gln AllHighlyPenetrant  pathogenic
EYA4 p.Gly277Ser AllHighlyPenetrant  pathogenic

无论格式如何,以下命令都应执行此任务

perl -pe 's/(p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}.*?)p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}/\1/' file
perl-pe的//'文件
将用
替换所有出现的

因此,要分解正则表达式:

(p\[A-Z][A-Z]{1,}[0-9]{1,}[A-Z][A-Z]{1,}.*?
捕获您的模式和之后的任何内容,直到它达到下一个条件。
*
后面的
是为了使它不贪婪,因为您希望它在第二次与模式匹配时停止。如果您没有放入
,并且您有第三个匹配项,或者之后有更多匹配项,那么它将删除找到的最后一个匹配项,因为
*
将捕获它可以捕获的所有内容

p\[A-Z][A-Z]{1,}[0-9]{1,}[A-Z][A-Z]{1,}
第二次使用您的模式时。这次我们不捕获它(不
()
),因为我们无论如何都要丢弃它

遵循此模式的任何内容都不会匹配,因此不会受到影响。然后,我们将第一个捕获的组
\1
替换为匹配的部分,因此“忘记”了第二个匹配

为什么perl优于grep


Grep是围绕搜索而设计的,因此很容易找到模式,但格式化输出却不那么容易。

假设重复的文本总是首先显示为第二个字段:

$ cat input.txt
BRAF      p.Gly464Val  Non-small cell p.Gly464Val   pathogenic
BAG3      p.His83Gln  AllHighlyPenetrant      p.His83Gln     pathogenic
EYA4      p.Gly277Ser  AllHighlyPenetrant     p.Gly277Ser    pathogenic

$ sed -r 's/^([^ ]* *)([^ ]*)(.*)(\2 *)(.*)/\1\2\3\5/' input.txt
BRAF      p.Gly464Val  Non-small cell pathogenic
BAG3      p.His83Gln  AllHighlyPenetrant      pathogenic
EYA4      p.Gly277Ser  AllHighlyPenetrant     pathogenic
说明:

  • 第一个括号匹配其后的第一个字段和空格
  • 第二个括号匹配第二个字段
  • 第三个括号匹配任何文本,直到再次找到第二个字段
  • 然后匹配重复的第二个字段&之后的任何空格
  • 匹配最后一个括号中剩余的任何内容
  • 最后,将其替换为除重复的第二个字段之外的所有内容

  • 我不知道怎么用这个…我是个新手。你能演示一下吗?不清楚。输入是否包含on;只有三行?第二个
    grep匹配是否总是最后一个字段的第二个?@AvinashRaj:不,有类似的10kentries@Jotne:是的,解释总是倒数第二+2