Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sed将匹配模式替换为行的开头?_Sed - Fatal编程技术网

如何使用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
    修饰符都无关紧要:只匹配最后一个逗号,只执行一次替换

    与命令的一个区别是,在输出中,逗号替换为换行符。这样我们就不会在同一个逗号上重复替换

  • ta

    如果最后一次替换成功,则跳回标签a

  • s/\n/,/g

    将所有换行符转换回逗号

使用awk 使用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
    修饰符都无关紧要:只匹配最后一个逗号,只执行一次替换

    与命令的一个区别是,在输出中,逗号替换为换行符。这样我们就不会在同一个逗号上重复替换

  • ta

    如果最后一次替换成功,则跳回标签a

  • s/\n/,/g

    将所有换行符转换回逗号

使用awk
我是说,可能吧?但是
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/,/'文件