如何用bash替换每行文本文件中逗号的最后六个空格?用逗号替换后六个空格
我:
$cat myfile
foo bar foo 6 1 3 23 1 20
foo bar 6 1 2 18 1 15
foo 5 5 0 15 1 21
我要的是:
$cat myfile
foo bar foo,6,1,3,23,1,20
foo bar,6,1,2,18,1,15
foo,5,5,0,15,1,21
任何帮助表示赞赏!谢谢!
如何用bash替换每行文本文件中逗号的最后六个空格?用逗号替换后六个空格
我:
$cat myfile
foo bar foo 6 1 3 23 1 20
foo bar 6 1 2 18 1 15
foo 5 5 0 15 1 21
我要的是:
$cat myfile
foo bar foo,6,1,3,23,1,20
foo bar,6,1,2,18,1,15
foo,5,5,0,15,1,21
任何帮助表示赞赏!谢谢!
它看起来像规则可能是一个逗号数字前替换任何空间:
sed 's/ \([0-9]\)/,\1/g' file
或者,下面您的规格(更换最后六个空格),你可以去这样的事情:
awk '{for(i=1; i<=NF; ++i)printf "%s%s", $i, (i<NF-6?FS:(i<NF?",":RS))}' file
此遍历字段中输入,打印每一个后跟一个空格(FS
),逗号或换行符(RS
),这取决于它是将线的端部的距离。
更完整的加REV(反向)的sed可能
rev myfile | sed 's/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/' | rev
为当然的第一OCCURENCES SED部分如果需要可以简化!
这可能为你工作(GNU SED):
sed -r ':a;s/(.*) /\1,/;x;s/^/x/;/^x{6}/{z;x;b};x;ba' file
它使用贪婪找上一行的最后一个空间,然后跟踪通过保持一个计数器在保持空间代替空格数的。
有趣的解决方案,顺便说一句这是什么{z; x; b}(顺便说一句,是从我这里)。更加珍贵的是那里有什么z和b? – josifoski
@josifoski'z'参见[here](http://www.gnu.org/software/sed/manual/sed.html#Extended-Commands))用于从保留空间中删除所有字符,即重置计数器。 'b'是sed中的'goto'命令,没有占位符,它充当断点命令,即没有进一步的sed命令被处理。 – potong
tnx解释,只有很小的更正,z是重新设置模式空间,因为你正确使用(不保留)(来自你已发布的链接) – josifoski
此解决方案不能很好地扩展。或者,您可以用换行符替换第六个换行符后的所有空格,然后用逗号替换左侧空格,并反向第一个替换,如:'rev myfile | sed's// \ n/7g; s//,/ g; s/\ n// g'| rev' – Birei
更优雅我承认是7g的想法 – josifoski