替换文本文件中每行的前六个逗号

时间:2016-02-15 21:37:43

标签: linux replace sed

我想使用sed或类似的东西替换文本文件中每行的前六个,

每行有,个以上|,但只有前六个应由FileOutputFormat.setOutputPath(job, OUTPUT_PATH)替换。

4 个答案:

答案 0 :(得分:1)

Sed并不真正支持“第一个 n 出现次数”的概念,只是“ n -th occurrence”; GNU sed有一个用于“替换 n -th on中的所有匹配”,这不是你想要的。要替换前六个逗号,必须六次调用s命令:

sed 's/,/|/;s/,/|/;s/,/|/;s/,/|/;s/,/|/;s/,/|/' infile

但是,如果你知道文件中没有|并且你有GNU sed,你可以这样做:

sed 's/,/|/g;s/|/,/7g' infile

用管道替换所有逗号,然后将管道从第7个开回到逗号。

如果事先有管道,你可以把它们变成你知道不在字符串中的东西:

sed 's/|/~~/g;s/,/|/g;s/|/,/7g;s/~~/|/g' infile

这会先将所有|转换为~~,然后将,转换为|,然后将|从第7回到, },最后~~回到|

测试此输入文件:

,,,,,,X,,,,,,
,,,|,,,|,,,|,,,|

第一个和第三个命令导致

||||||X,,,,,,
||||||||,,,|,,,|

第二行会在第二行失败,因为已有管道符。

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed 'y/,/\n/;s/\n/,/7g;y/\n/|/' file

将所有,翻译为\n,然后将\n&#从第七个,替换为行尾39; s,然后用\n替换剩余的|

答案 2 :(得分:0)

在sed中使用以下模式:sed 's/old/new/<number>'

<number>是您希望应用此模式的次数。

您可以将<number>替换为g,以将模式应用于所有匹配项。

答案 3 :(得分:0)

您可以尝试此sed

sed -r ':loop; s/^([^,]*),/\1|/g; /^([^|]*\|){6}/t; b loop' file

(OR)

sed ':loop; s/^\([^,]*\),/\1|/g; /^\([^|]*|\)\{6\}/t; b loop' file

<强>测试

$ cat file
a,b,c,d,e,f,g,h,i,j,k

$ sed -r ':loop; s/^([^,]*),/\1|/g; /^([^|]*\|){6}/t; b loop' file
a|b|c|d|e|f|g,h,i,j,k

注意:只有在此之前没有任何管道(|)时才会有效。