我想使用sed或类似的东西替换文本文件中每行的前六个,
。
每行有,
个以上|
,但只有前六个应由FileOutputFormat.setOutputPath(job, OUTPUT_PATH)
替换。
答案 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
注意:只有在此之前没有任何管道(|
)时才会有效。