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

Enr*_*que 2 bash perl awk

我正在处理许多字符串,例如这个结构:

=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
Run Code Online (Sandbox Code Playgroud)

由于程序中存在生成文件的错误,有时会出现额外的分号,只有一个分号出现在它们不应出现的位置.例如:

=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
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我使用正则表达式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
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何在不影响第一个分号的情况下删除最后一个分号?

fed*_*qui 6

使用如何使用sed替换字符串中最后一个字符?你可以说:

sed -r 's/(.*);/\1/' file
Run Code Online (Sandbox Code Playgroud)

也就是说,匹配所有内容.*直到;找到最后一个.这是有效的,因为sed非常贪婪,并且会一直啜饮所有内容,直到;找到最后一个.

与您的初始表达一起,您将拥有:

sed -re 's/;+/;/g' -e 's/(.*);/\1/' file
Run Code Online (Sandbox Code Playgroud)

由于您的输入文件包含如此多的数据,因此很难看到输出.使用一些虚拟数据查看它:

$ cat file
hello;;;;;how;are;you
i;am;fine
Run Code Online (Sandbox Code Playgroud)

只需删除最后一个半冒号:

$ sed -r 's/(.*);/\1/' file
hello;;;;;how;areyou
i;amfine
Run Code Online (Sandbox Code Playgroud)

删除最后一个半冒号并挤压多个半冒号:

$ sed -re 's/;+/;/g' -e 's/(.*);/\1/' file
hello;how;areyou
i;amfine
Run Code Online (Sandbox Code Playgroud)