如何使用sed将匹配模式替换为行的开头?
我有一个这样的文件:如何使用sed将匹配模式替换为行的开头?,sed,Sed,我有一个这样的文件: 254529 ANN=C|blabla,T|blabla,A|blabla 254540 ANN=T|blabla,G|blabla,C|blabla 254586 ANN=TTGG|blabla,A|blabla 我想用逗号替换文件中的逗号,后跟行首的数字 sed -e 's/^\(.*\)\(\t.*\),/\1\2,\1\t/g' file blabla在我的文件中实际上是一长串的文本,为了可读性,我在这里更改了这些文本。每个blabla都是不同的 我尝试了
254529 ANN=C|blabla,T|blabla,A|blabla
254540 ANN=T|blabla,G|blabla,C|blabla
254586 ANN=TTGG|blabla,A|blabla
我想用逗号替换文件中的逗号,后跟行首的数字
sed -e 's/^\(.*\)\(\t.*\),/\1\2,\1\t/g' file
blabla
在我的文件中实际上是一长串的文本,为了可读性,我在这里更改了这些文本。每个blabla
都是不同的
我尝试了以下方法,但它只替换了行中的最后一个逗号
sed -e 's/^\(.*\)\(\t.*\),/\1\2,\1\t/g' file
这就是我得到的:
254529 ANN=C|blabla,T|blabla,254529 A|blabla
254540 ANN=T|blabla,G|blabla,254540 C|blabla
254586 ANN=TTGG|blabla,254586 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是否可行
谢谢使用sed
问题是,全局替换的g
不会进行重叠替换。简单的解决方案是重复替换的次数,只要有逗号。像这样:
$ sed ':a; s/^\(.*\)\(\t.*\),/\1\2\n\1\t/; ta; s/\n/,/g' file
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
工作原理:
这将创建一个标签:a
a
这将执行替换(稍微修改)。因为s/^\(.*)\(\t.*),/\1\2\n\1\t/
是“贪婪的”,所以它在行中的最后一个逗号上执行*
由于sed -e 's/^\(.*\)\(\t.*\),/\1\2,\1\t/g' file
是“贪婪的”,因此无论是否应用*
修饰符都无关紧要:只匹配最后一个逗号,只执行一次替换 与命令的一个区别是,在输出中,逗号替换为换行符。这样我们就不会在同一个逗号上重复替换g
如果最后一次替换成功,则跳回标签ata
将所有换行符转换回逗号s/\n/,/g
g
不会进行重叠替换。简单的解决方案是重复替换的次数,只要有逗号。像这样:
$ sed ':a; s/^\(.*\)\(\t.*\),/\1\2\n\1\t/; ta; s/\n/,/g' file
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
工作原理:
这将创建一个标签:a
a
这将执行替换(稍微修改)。因为s/^\(.*)\(\t.*),/\1\2\n\1\t/
是“贪婪的”,所以它在行中的最后一个逗号上执行*
由于sed -e 's/^\(.*\)\(\t.*\),/\1\2,\1\t/g' file
是“贪婪的”,因此无论是否应用*
修饰符都无关紧要:只匹配最后一个逗号,只执行一次替换 与命令的一个区别是,在输出中,逗号替换为换行符。这样我们就不会在同一个逗号上重复替换g
如果最后一次替换成功,则跳回标签ata
将所有换行符转换回逗号s/\n/,/g
我是说,可能吧?但是
perl-pe'($p)=/^(\d+\t)/或者下一个;s/,/,$p/g'
简单多了。谢谢你的选择,我是说,可能吧?但是perl-pe'($p)=/^(\d+\t)/或者下一个;s/,/,$p/g'
非常简单。感谢您的选择。如果每个输入行有多个选项卡,或者第一个字段中有逗号,我认为这两种解决方案都会产生有趣的结果。谢谢,我不知道label命令。我在搜索类似于sed'/match_the_number/s/,/,use_the_number/'
的内容,但我不确定这是否可行。前提是第一个字段后面的空白是一个制表符。当然,最好是在整个过程中继续工作,并尽可能防止regexp引擎回溯?@potong如果要避免回溯,请使用awk解决方案(包括在答案末尾)。此外,是的,OP指定第一个字段后面有一个选项卡。@John1024 greed可能有用,但通常很昂贵,通过修改regexp,解决方案可以更高效,也可以进行自我记录,例如sed-e':a;s/^((\s+[^,]*),/\1\n\2\t/;助教;y/\n/,/'file
我认为如果每个输入行有多个制表符或第一个字段中有逗号,这两种解决方案都会产生有趣的结果。谢谢,我不知道label命令。我在搜索类似于sed'/match_the_number/s/,/,use_the_number/'
的内容,但我不确定这是否可行。前提是第一个字段后面的空白是一个制表符。当然,最好是在整个过程中继续工作,并尽可能防止regexp引擎回溯?@potong如果要避免回溯,请使用awk解决方案(包括在答案末尾)。此外,是的,OP指定第一个字段后面有一个选项卡。@John1024 greed可能有用,但通常很昂贵,通过修改regexp,解决方案可以更高效,也可以进行自我记录,例如sed-e':a;s/^((\s+[^,]*),/\1\n\2\t/;助教;y/\n/,/'文件