繁体   English   中英

如何删除字符串中的最后一个分号?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM