![如何排除同一行中两个模式之间的文本](https://linux22.com/image/1060951/%E5%A6%82%E4%BD%95%E6%8E%92%E9%99%A4%E5%90%8C%E4%B8%80%E8%A1%8C%E4%B8%AD%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E6%96%87%E6%9C%AC.png)
我有一个包含输入的文件
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
使用 EREs/old/new
old
用。。。来代替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
- 返回被捕获的群体