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
是基于行的,因此您无法以这种方式匹配换行符;您的命令不会生成您引用的输出。如果您使用的是GNU
sed
,请使用
-z
,如Lars Fischer的答案所示;否则,您需要一个预先读取所有输入行的循环。就像OP自己的方法一样,除非在替换命令之前先使用一个将所有行读取到模式空间的循环,否则这将不起作用。@mklement0对于我来说,gnu sed的
-z
选项在没有循环的情况下运行良好:
sed-z's/\n/,/g;s/,$/'lines.txt
++-这是一个简单的解决方案,但请添加一条注释,指出
-z
需要GNU
sed
。添加
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