带竖线的 sed?

sed with vertical bar?

我有一个列表

>ANARCI-HMM_human_167.7|pdb|7EPU|A
>ANARCI-HMM_alpaca_173.7|pdb|7EVY|E
>ANARCI-HMM_alpaca_172.8|pdb|7F2O|S
>ANARCI-HMM_alpaca_171.8|pdb|7F4F|S
>ANARCI-HMM_alpaca_173.6|pdb|7F8W|D

我想删除从 ANARCI 到第一个竖线 |

期待

>pdb|7EPU|A
>pdb|7EVY|E
>pdb|7F2O|S
>pdb|7F4F|S
>pdb|7F8W|D

我试过了

sed 's/ANARCI.*\|//g'

但没用。

你知道在这种情况下如何使用 sed 吗?

尝试:

sed 's/ANARCI[^|]*\|//g'

不匹配 |

使用sed

$ sed 's/[A-Z][^|]*|//' input_file
>pdb|7EPU|A
>pdb|7EVY|E
>pdb|7F2O|S
>pdb|7F4F|S
>pdb|7F8W|D

第一个解决方案:使用您显示的示例,请尝试遵循 sed 代码。

sed -E 's/(.*)ANARCI[^|]*\|(.*)//' Input_file

说明: 为以上 sed 代码添加详细说明。

  • 使用 sed-E 选项为程序启用 ERE(扩展正则表达式)。
  • 然后使用sed将匹配模式存储到临时缓冲存储器(称为捕获组)中的能力,通过它我们可以在替换时使用捕获的值。
  • 在这里创建 2 个捕获组,第一个包含 ANARCI 字符串之前的所有内容,第二个捕获组包含第一个管道之后的所有内容(从 ANARCI 匹配到第一个管道)以获取第一个管道之后的其余部分。
  • 在用第一个和第二个捕获组执行替换替换行时。


第二个解决方案: 您也可以使用 awk 来完成此任务,使用 match 函数 awk。简单的解释是,使用 awkmatch 函数并仅匹配输出中不需要的部分,同时打印值打印除匹配部分(不需要)之外的所有其他内容。

awk 'match([=11=],/ANARCI[^|]*/){print substr([=11=],1,RSTART-1) substr([=11=],RSTART+RLENGTH+1)}' Input_file


第三个解决方案:awk 中添加 1 个解决方案,其中将字段分隔符设置为:来自字符串 ANARCI 直到第一次出现管道。然后在主要 awk 程序中打印第一个和最后一个字段,所需的值根据示例显示。

awk -v FS="ANARCI[^\\|]*\\|" '{print  $NF}' Input_file

如果您想从第一个竖线 | 的 ANARCI 中删除,试试这个:

sed 's/ANARCI[^|]*\|//g'

sed 's/ANARCI[^|]*\|(.*)//'