如何将特定行的空格替换为 _

如何将特定行的空格替换为 _

我有一个包含多个段落的文本文件。每个段落都有带空格的标题。我想将[:,之间的文本空格替换为_。这是我正在谈论的文件中的文本摘录

[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

相关内容