我正在处理许多字符串,例如这个结构:
=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)
我的问题是:如何在不影响第一个分号的情况下删除最后一个分号?
使用如何使用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)