You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:50:04