Bash sed-执行替换后从列出的值中删除最后一个逗号
我正在使用Bash sed-执行替换后从列出的值中删除最后一个逗号,bash,shell,unix,sed,Bash,Shell,Unix,Sed,我正在使用sed将我的新行文件\n替换为',,这很好,但是,在我的最后一项中,我不想要, 我怎样才能删除这个 例如: sed 's/\n/,/g' myfile.out > myfile.csv 输出: 1,2,3,4,5,6, 您可以在第一个命令之后添加第二个s命令:sed-z的s/\n/,/g;s/,$/。这将删除末尾的逗号。(选项-z来自gnu-sed,我需要它来让第一个s命令工作。)考虑一下,这是最高效、最优雅的 awk替代方案,不需要先将整个文件读入内存: awk '{ pr
sed
将我的新行文件\n
替换为',
,这很好,但是,在我的最后一项中,我不想要,
我怎样才能删除这个
例如:
sed 's/\n/,/g' myfile.out > myfile.csv
输出:
1,2,3,4,5,6,
您可以在第一个命令之后添加第二个
s
命令:sed-z的s/\n/,/g;s/,$/
。这将删除末尾的逗号。(选项-z
来自gnu-sed,我需要它来让第一个s
命令工作。)考虑一下,这是最高效、最优雅的
awk
替代方案,不需要先将整个文件读入内存:
awk '{ printf "%s%s", sep, $0; sep = "," }' myfile.out > myfile.csv
如果输出应有尾随换行符(谢谢,):
- 对于第一个输入行,
,由于是未初始化的变量,默认为空字符串,实际上只打印输入行sep
$0
- 将
设置为sep
在第一次,“
可确保所有剩余行都有一个打印后
前缀,
在处理完所有输入行后打印一个尾随换行符。(END{printf”\n}
也可以,因为print”“
附加了输出记录分隔符(print
),默认为换行符)ORS
净效果是,
,
仅放在输入行之间,因此输出不会有尾随逗号。您可以使用标签:
$ cat file
1
2
3
4
5
6
$ sed ':a;N;s/\n/,/;ba' file
1,2,3,4,5,6
也可以使用“粘贴”命令:
$ paste -sd, file
1,2,3,4,5,6
您是否尝试过这样做:?由于默认情况下
sed
是基于行的,因此您无法以这种方式匹配换行符;您的命令不会生成您引用的输出。如果您使用的是GNUsed
,请使用-z
,如Lars Fischer的答案所示;否则,您需要一个预先读取所有输入行的循环。就像OP自己的方法一样,除非在替换命令之前先使用一个将所有行读取到模式空间的循环,否则这将不起作用。@mklement0对于我来说,gnu sed的-z
选项在没有循环的情况下运行良好:sed-z's/\n/,/g;s/,$/'lines.txt
++-这是一个简单的解决方案,但请添加一条注释,指出-z
需要GNUsed
。添加awk-v ORS=“”代码>也将从输出中删除换行符。@Larsfisher:谢谢你的提示;这很好,但实际上更容易使用printf
而不是print
;答案更新了。他没有说,但我怀疑OP希望输出以换行结束。如果是这样,那么添加END{print”“}
。FWIW我总是在printf“\n”
上使用print”“
,因为无论ORS
有什么值,前者都会起作用,而后者则要求您在为粘贴解决方案更改ORS
时记住更改printf语句,这不仅更简单,而且避免了先将整个输入文件读入内存的需要。
$ paste -sd, file
1,2,3,4,5,6