Bash 用逗号替换最后六个空格

Bash 用逗号替换最后六个空格,bash,awk,sed,Bash,Awk,Sed,如何用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'

如何用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

awk'{for(i=1;i规则可能是将数字前的任何空格替换为逗号:

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

awk'{for(i=1;i更完整的sed加上rev(用于反向)可能是

rev myfile | sed 's/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/' | rev

如果需要,第一次出现的sed部分当然可以简化!

可能需要更完整的sed,并添加版本(用于反向)

rev myfile | sed 's/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/' | rev
如果需要,第一次出现的sed部分当然可以简化!

这可能适合您(GNU sed):

这使用贪婪来查找行上的最后一个空格,然后通过在保留空格中保留计数器来跟踪替换的空格数。

这可能适用于您(GNU-sed):


这使用贪婪查找行上的最后一个空格,然后通过在保留空间中保留计数器来跟踪替换的空格数。

此解决方案不能很好地扩展。或者,您可以使用换行符替换第六个空格之后的所有空格,然后用逗号替换左空格,并反转第一个替换,如:
rev myfile|sed’s/\n/7g;s/,/g;s/\n//g’| rev
我承认更优雅的是7g思想这个解决方案不能很好地扩展。或者你可以用换行符替换第六个后面的所有空格,然后用逗号替换左边的空格,并反转第一个替换,比如:
rev myfile | sed’s/\n/7g;s/,/g;s/\n//\g’;rev是7g理想的解决方案,顺便说一句,{z;x;b}这部分是什么(顺便说一句,upvote来自我)更准确地说,z和b是什么?@josifoski'z'参见,用于从保留空间中删除所有字符,即重置计数器。
b
是sed中的
goto
命令,没有占位符,它充当中断命令,即不再处理sed命令。tnx解释一下,只有很少的更正,z重置p您正确使用的模式空间(非保留)(来自您发布的链接)@josifoski抱歉,我的措辞误导了您。
z
命令只影响模式空间,但我的意思是保留空间中的值(通过使用
x
成为模式空间)一旦为下一行准备好了所需的空格数,就需要擦除。HTW解决方案,顺便问一下,这部分是什么{z;x;b}(顺便说一句,upvote来自我)更准确地说,z和b是什么?@josifoski'z'参见,用于从保留空间中删除所有字符,即重置计数器。
b
是sed中的
goto
命令,没有占位符,它充当中断命令,即不再处理sed命令。tnx解释一下,只有很少的更正,z重置p您正确使用的模式空间(非保留)(来自您发布的链接)@josifoski抱歉,我的措辞误导了您。
z
命令只影响模式空间,但我的意思是保留空间中的值(通过使用
x
成为模式空间)一旦为下一行准备好所需的空间数,则需要擦除。HTH