我有一个包含多个段落的文本文件。每个段落都有带空格的标题。我想将[
和:
,之间的文本空格替换为_
。这是我正在谈论的文件中的文本摘录
[Candidatus Protochlamydia amoebophila UWE25: NC_005861]
MNQRTGILLVNLGTPKTPRPKDVYRYLNEFLTDGRVIDLPWLKRQLLVRC
IIVPFRYKQSSMLYQKLWTAEGSPLLVHGIAVQTKLQMILGESFQVELAM
[Gluconobacter oxydans 621H: NC_006677]
MAFLHKTPRIAPPPEGRTGILLINLGTPDDTGYFSVRRYLSEFLSDRRVI
ESPPLIWQPILQSIILTKRPFASGANYARIWHKEENASPLRVYTRRQAEG
我需要把它改成这样:
[Candidatus_Protochlamydia_amoebophila_UWE25: NC_005861]
MNQRTGILLVNLGTPKTPRPKDVYRYLNEFLTDGRVIDLPWLKRQLLVRC
IIVPFRYKQSSMLYQKLWTAEGSPLLVHGIAVQTKLQMILGESFQVELAM
[Gluconobacter_oxydans_621H: NC_006677]
MAFLHKTPRIAPPPEGRTGILLINLGTPDDTGYFSVRRYLSEFLSDRRVI
ESPPLIWQPILQSIILTKRPFASGANYARIWHKEENASPLRVYTRRQAEG
我试过了
$ sed -e 's/\s\+/_/g' input.txt > output.txt
但这会将所有空格替换为_
How can I set a limit on this command?
答案1
一种方法是使用循环,一次替换一个空格,直到第一个冒号之前不再有空格:
$ sed -e :a -e '/[^:]* [^:]*:/s/ /_/;ta' input.txt
[Candidatus_Protochlamydia_amoebophila_UWE25: NC_005861]
MNQRTGILLVNLGTPKTPRPKDVYRYLNEFLTDGRVIDLPWLKRQLLVRC
IIVPFRYKQSSMLYQKLWTAEGSPLLVHGIAVQTKLQMILGESFQVELAM
[Gluconobacter_oxydans_621H: NC_006677]
MAFLHKTPRIAPPPEGRTGILLINLGTPDDTGYFSVRRYLSEFLSDRRVI
ESPPLIWQPILQSIILTKRPFASGANYARIWHKEENASPLRVYTRRQAEG
一种更 KISS 的方法可能是替换所有空格 - 然后重新替换冒号后面的空格:
sed -e 's/\s\+/_/g' -e 's/:_/: /' input.txt
如果 Perl 是一个选项,你可以使用消极回顾仅替换那些前面没有冒号的实例:
perl -pe 's/(?<!:) /_/g' input.txt