如何排除同一行中两个模式之间的文本

如何排除同一行中两个模式之间的文本

我有一个包含输入的文件

sp|O34439|YFLP_BACSU UPF0065 protein YflP OS=Bacillus subtilis (strain 168) GN=yflP PE=3 SV=2
MKKSIILLNILLIFMQGDIRQAAAPRLPDGPIEIVVPAEPSGGWDVTAQAIQSVLRQKQIVKDDVHIVYKSGGGGEK
sp|Q44018|YGB7_CUPNE UPF0065 protein in gbd 5'region OS=Cupriavidus necator PE=3 SV=1
MQRRHFIARAGIAAATAALGLAAMPAQAQADKFPQRPIRLVIGYTAGGSTDIPFRVLADNASKILGQPVIVENK

并需要得到这个输出:

sp|O34439|YFLP_Bacillus subtilis
MKKSIILLNILLIFMQGDIRQAAAPRLPDGPIEIVVPAEPSGGWDVTAQAIQSVLRQKQIVKDDVHIVYKSGGGGEK
sp|Q44018|YGB7_Cupriavidus necator
MQRRHFIARAGIAAATAALGLAAMPAQAQADKFPQRPIRLVIGYTAGGSTDIPFRVLADNASKILGQPVIVENK

所以,我需要排除模式>|......|....和之间的所有内容OS=....................(如果我可以排除OS=并保留,就更好了)并排除同一行中第二个模式之后的所有内容。

答案1

sed 's/\([^_]*\).*=\([A-Z][a-z ]*\).*/\1_\2/' test

对文件执行您想要的操作test并将输出写入终端:

> sed 's/\([^_]*\).*=\([A-Z][a-z ]*\).*/\1_\2/' test
sp|O34439|YFLP_Bacillus subtilis 
MKKSIILLNILLIFMQGDIRQAAAPRLPDGPIEIVVPAEPSGGWDVTAQAIQSVLRQKQIVKDDVHIVYKSGGGGEK
sp|Q44018|YGB7_Cupriavidus necator 
MQRRHFIARAGIAAATAALGLAAMPAQAQADKFPQRPIRLVIGYTAGGSTDIPFRVLADNASKILGQPVIVENK

添加> filename到命令末尾以将输出保存在文件中filename

解释

  • \(.*_\)将所有内容保留到第一个下划线,并将其保存为第 1 组
  • .*=把所有内容都放到第一个等号处
    • 替换为.*OS=采取一切直到OS=
  • \([A-Z][a-z ]*\)取一个大写字母和其后的所有小写字母及空格,保存为第 2 组
    • 替换为\([^ ]*[ ][^ ]*\)搜索其中恰好有一个空格的字符串
  • .*(此处不显示前面的空格!)占用一个空格,其余部分
  • \1\2第 1 组接着第 2 组

答案2

假设有很多一致性,您可以使用类似...

$ sed -r 's/([^ ]+\|[^ ]+\|[^_]+_)[^_]+ .* OS=([^ ]+ [^ ]+) .*/\1\2/' file
sp|O34439|YFLP_Bacillus subtilis
MKKSIILLNILLIFMQGDIRQAAAPRLPDGPIEIVVPAEPSGGWDVTAQAIQSVLRQKQIVKDDVHIVYKSGGGGEK
sp|Q44018|YGB7_Cupriavidus necator
MQRRHFIARAGIAAATAALGLAAMPAQAQADKFPQRPIRLVIGYTAGGSTDIPFRVLADNASKILGQPVIVENK

笔记

  • -r使用 ERE
  • s/old/newold用。。。来代替new
  • (some chars)记得some chars稍后参考\1等等
  • [^ ]+至少一个非空格字符([^_]+至少一个非下划线字符)
  • \|文字|since 在 ERE 中|用于交替
  • .*任意数量的任意字符
  • \1\2反向引用已保存的模式

答案3

这会起作用:

$ sed -r 's/(.*_)[A-Z].*=(\w+)\s{1,2}(\w+)\s{1,2}.*\s.*/\1\2 \3/g' file.txt
sp|O34439|YFLP_Bacillus subtilis    
MKKSIILLNILLIFMQGDIRQAAAPRLPDGPIEIVVPAEPSGGWDVTAQAIQSVLRQKQIVKDDVHIVYKSGGGGEK
sp|Q44018|YGB7_Cupriavidus necator
MQRRHFIARAGIAAATAALGLAAMPAQAQADKFPQRPIRLVIGYTAGGSTDIPFRVLADNASKILGQPVIVENK

解释:

  • (.*_)- 返回直到第一个大写字母的所有内容
  • .*= - 取到等号
  • (\w+)\s{1,2}- 返回1-2空格前的第一个单词
  • (\w+)\s{1,2}- 同上
  • .*\s.*- 获取所有直到空间以及之后的所有东西
  • \1\2 \3- 返回被捕获的群体

相关内容