如何使用sed将文件中的逗号替换为逗号加行首对应数字?
用Sed实现全局替换逗号为“逗号+行首数字”
当然可以用Sed解决这个问题!你之前的命令只替换了每行最后一个逗号,根源在于Sed默认的贪婪匹配和单次替换逻辑——你的正则会匹配到每行的最后一个逗号,而g标志在这里因为正则结构的原因并没有生效。
解决方案:循环替换所有逗号
我们可以利用Sed的分支循环功能,重复替换每行中的逗号,直到所有逗号都处理完毕:
sed -E ':loop; s/^([0-9]+)(.*),/\1\2,\1 /; t loop' your_file.txt
命令解析:
-E:启用扩展正则表达式,让括号不需要转义,更易读:loop:定义一个循环标签,用于后续跳转s/^([0-9]+)(.*),/\1\2,\1 /:^([0-9]+):捕获行首的数字序列(也就是你要插入到逗号后的内容)(.*),:匹配从捕获的数字到当前最后一个逗号的所有内容- 替换为
\1\2,\1:保留原有内容,把逗号替换为逗号+捕获的数字+空格
t loop:如果上一次替换成功(还存在未处理的逗号),就跳回loop标签继续执行,直到没有逗号可替换
测试效果
针对你的输入:
254529 ANN=C|blabla,T|blabla,A|blabla 254540 ANN=T|blabla,G|blabla,C|blabla 254586 ANN=TTGG|blabla,A|blabla
执行命令后会得到你期望的结果:
254529 ANN=C|blabla,254529 T|blabla,254529 A|blabla 254540 ANN=T|blabla,254540 G|blabla,254540 C|blabla 254586 ANN=TTGG|blabla,254586 A|blabla
为什么原命令失效?
你之前的sed -e 's/^\(.*\)\(\t.*\),/\1\2,\1\t/g' file存在两个问题:
.*是贪婪匹配,^\(.*\)会直接匹配到行内最后一个制表符的位置,导致只能定位到最后一个逗号- 即使加了
g标志,整个正则在每行只能匹配一次,无法处理多个逗号
内容的提问来源于stack exchange,提问作者Anthony Piot
相关产品推荐
相关产品推荐

