如何用sed替换文本中;与[之间的逗号为空格?
需求说明
我想用sed工具把文本文件中位于;和[之间的所有逗号替换成空格。
示例输入行:
K01810,GPI,,pgi;,glucose-6-phosphate,isomerase,[EC:5.3.1.9]
期望输出:
K01810,GPI,,pgi; glucose-6-phosphate isomerase [EC:5.3.1.9]
我试过执行命令:
sed 's/;\(.*\)\[/;\1[/g' myfile.txt > newfile
但文件内容完全没变化。以下是myfile.txt的内容:
09100,Metabolism 09101,Carbohydrate,metabolism 00010,Glycolysis,/,Gluconeogenesis,[PATH:ko00010] K00844,HK;,hexokinase,[EC:2.7.1.1] K12407,GCK;,glucokinase,[EC:2.7.1.2] K00845,glk;,glucokinase,[EC:2.7.1.2] K25026,glk;,glucokinase,[EC:2.7.1.2] K01810,GPI,,pgi;,glucose-6-phosphate,isomerase,[EC:5.3.1.9] K06859,pgi1;,glucose-6-phosphate,isomerase,,archaeal,[EC:5.3.1.9] K13810,tal-pgi;,transaldolase,/,glucose-6-phosphate,isomerase,[EC:2.2.1.2,5.3.1.9] K15916,pgi-pmi;,glucose/mannose-6-phosphate,isomerase,[EC:5.3.1.9,5.3.1.8] K24182,PFK9;,6-phosphofructokinase,[EC:2.7.1.11] K00850,pfkA,,PFK;,6-phosphofructokinase,1,[EC:2.7.1.11] K16370,pfkB;,6-phosphofructokinase,2,[EC:2.7.1.11]
问题原因
你之前的sed命令只是匹配了;到[之间的内容并原样放回,根本没有处理逗号,所以文件内容不会有任何变化。
解决方案
sed默认只能单次匹配替换,要处理一段范围内的所有目标字符,需要用循环替换的方式,执行以下命令即可:
sed ':loop s/;\([^,\[]*\),/\1 /; t loop' myfile.txt > newfile
如果是GNU sed(Linux系统常用),可以用更简洁的扩展正则写法:
sed -E ':loop s/;([^,\[]*),/\1 /; t loop' myfile.txt > newfile
命令解释
:loop:定义一个循环标签,用于后续跳转重复操作s/;\([^,\[]*\),/\1 /:匹配;开头,后面跟着既不是逗号也不是[的内容,再跟上一个逗号,把这个逗号替换成空格。每次只处理;到[之间的一个逗号t loop:如果上一次替换操作成功,就跳回loop标签继续循环,直到这段范围内没有逗号为止
内容的提问来源于stack exchange,提问作者Geomicro
相关产品推荐
相关产品推荐

