[英]How can I remove the last semicolon in a string?
我正在处理许多字符串,例如这个结构:
=Cluster=
SPEC PRD000681;PRIDE_Exp_Complete_Ac_22493.xml;spectrum=4691 true LHDEEIQELQAQIQEQHVQIDMDVSKPDLTAALR 3940.8833 1 9913 0.9988012901749596
SPEC PRD000681;PRIDE_Exp_Complete_Ac_22495.xml;spectrum=752 true LHDEEIQELQAQIQEQHVQIDMDVSKPDLTAALR 3940.8833 1 9913 0.9988012901749596
由于程序中存在生成文件的错误,有时会出现额外的分号,只有一个分号出现在它们不应出现的位置。 例如:
=Cluster=
SPEC PRD000681;;;;;PRIDE_Exp_Complete_Ac_22493.xml;spectrum=4691 true LHDEEIQELQAQIQEQHVQIDMDVSKPDLTAALR 3940.8833 1 9913 ; 0.9988012901749596
SPEC PRD000681;PRIDE_Exp_Complete_Ac_22495.xml;;;;spectrum=752 true LHDEEIQELQAQIQEQHVQIDMDVSKPDLTAALR 3940.8833 1 9913 ; 0.9988012901749596
为了解决这个问题,我使用正则表达式s/;+/;/g;
或awk '{gsub(/[;]+/,";")}1'input > output
但我不知道如何删除删除最后一个分号而不影响第一个分号。
一个好的输出将是这样的:
=Cluster=
SPEC PRD000681;PRIDE_Exp_Complete_Ac_22493.xml;spectrum=4691 true LHDEEIQELQAQIQEQHVQIDMDVSKPDLTAALR 3940.8833 1 9913 0.9988012901749596
SPEC PRD000681;PRIDE_Exp_Complete_Ac_22495.xml;spectrum=752 true LHDEEIQELQAQIQEQHVQIDMDVSKPDLTAALR 3940.8833 1 9913 0.9988012901749596
我的问题是:如何在不影响第一个分号的情况下删除最后一个分号?
使用如何使用sed替换字符串中最后一个字符? 你可以说:
sed -r 's/(.*);/\1/' file
也就是说,将所有内容与.*
匹配到最后一个;
找到了。 这是有效的,因为sed非常贪婪,并且会把所有东西都沾到最后;
找到了。
与您的初始表达一起,您将拥有:
sed -re 's/;+/;/g' -e 's/(.*);/\1/' file
由于您的输入文件包含如此多的数据,因此很难看到输出。 使用一些虚拟数据查看它:
$ cat file
hello;;;;;how;are;you
i;am;fine
只需删除最后一个半冒号:
$ sed -r 's/(.*);/\1/' file
hello;;;;;how;areyou
i;amfine
删除最后一个半冒号并挤压多个半冒号:
$ sed -re 's/;+/;/g' -e 's/(.*);/\1/' file
hello;how;areyou
i;amfine
在Perl
perl -i -pe 's/.*\K;//' myfile
使用rev
和awk(和@ fedorqui的例子):
$ rev file | awk '{ sub(/;/, "") }1' | rev
hello;;;;;how;areyou
i;amfine
使用rev
来反转记录,删除第一个;
与sub
来代替,而rev
再次记录。 您可以先使用gsub
替换多个;
有一个:
$ rev file | awk '{ gsub(/\;+/, ";"); sub(/;/, "") }1' | rev
hello;how;areyou
i;amfine
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.