【问题标题】:sed - removing last comma from listed value after doing a replacesed - 替换后从列出的值中删除最后一个逗号
【发布时间】:2016-04-24 21:43:46
【问题描述】:

我正在使用sed 将我的新行文件\n 替换为',',这可以正常工作,但是在我的最后一项中,我不想要,

我怎样才能删除它?

例子:

sed 's/\n/,/g' myfile.out > myfile.csv

输出:

1,2,3,4,5,6,

【问题讨论】:

  • 你试过这个吗:stackoverflow.com/questions/947404/…
  • 由于sed默认是基于line的,你不能用这种方式匹配换行符;您的命令不会产生您引用的输出。如果您使用的是 GNU sed,请使用 -z,如 Lars Fischer 的回答;否则,您需要一个循环来预先读取所有输入行。

标签: bash shell unix sed


【解决方案1】:

你可以使用标签:

$ 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

【讨论】:

  • ++ 用于paste 解决方案,不仅更简单,而且避免了先将整个输入文件读入内存的需要。
【解决方案2】:

考虑jaypal singh's paste solution,这是最高效和优雅的。

awk 替代方案,不需要先将整个文件读入内存:

awk '{ printf "%s%s", sep, $0; sep = "," }' myfile.out > myfile.csv

如果输出应该有一个尾随换行符(谢谢Ed Morton):

awk '{ printf "%s%s", sep, $0; sep = "," } END { printf "\n" }' myfile.out > myfile.csv
  • 对于第一行输入,sep,由于是一个未初始化的变量,默认为空字符串,实际上只打印输入行$0

  • 在第一个 print 之后将 sep 设置为 "," 可确保所有剩余的行都有一个 , 前缀。

  • END { printf "\n" } 在处理完所有输入行后打印尾随换行符。 (print "" 也可以工作,因为print 附加了输出记录分隔符 (ORS),默认为换行符)。

最终结果是, 仅放置在输入行之间,因此输出不会有尾随逗号。

【讨论】:

  • 添加 awk -v ORS="" ... 也会从输出中删除换行符。
  • @LarsFischer:感谢您的提示;效果很好,但实际上简单地使用printf 而不是print 更容易;答案已更新。
  • 他没有说,但我怀疑 OP 希望输出以换行符结尾。如果是这样,请添加END{print ""}'
  • FWIW 我总是使用print "" 而不是printf "\n",因为无论ORS 有什么值,前者都可以工作,而后者需要你记住如果/何时更改该 printf 语句你改变ORS
【解决方案3】:

您可以在第一个命令之后添加第二个 s 命令:sed -z 's/\n/,/g ; s/,$//。这将删除末尾的逗号。 (-z 选项来自 gnu sed,我需要它来让第一个 s 命令正常工作。)

【讨论】:

  • 就像 OP 自己的方法一样,除非您在替换命令之前使用循环将 all 行首先读入模式空间,否则这将不起作用。
  • @mklement0 对我来说 gnu sed 的 -z 选项在没有循环的情况下效果很好:sed -z 's/\n/,/g ; s/,$//' lines.txt
  • ++ - 这是一个简单的解决方案,但请添加注释以指出 -z 需要 GNU sed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多