如何在除最后一行之外的每一行的末尾添加逗号?

Joa*_*iay 22 bash command-line sed

我想在除最后一行之外的这种文件的每一行的末尾添加一个逗号:

我现在有这个:

{...}
{...}
{...}
{...}
Run Code Online (Sandbox Code Playgroud)

我要这个:

{...},
{...},
{...},
{...}
Run Code Online (Sandbox Code Playgroud)

如何使用命令行执行此操作?用sed命令可以吗?

tri*_*eee 58

以下sed脚本具有一个地址表达式$!,该表达式匹配不是最后一行的行,以及一个s/$/,/在行尾添加逗号的替代操作.

sed '$!s/$/,/' file
Run Code Online (Sandbox Code Playgroud)

($地址中的地址指的是最后一行,$替换中的正则表达式中的每一行指的是最后一个字符位置.它们是无关的,尽管在某种意义上类似.)

这将修改后的内容打印file到标准输出; 重定向到另一个文件以将其保存到文件中,或者sed -i如果您sed支持该文件则使用.(某些变体需要该-i选项的空参数,特别是*BSD/OSX sed.)

如果你的任务是从不是的东西生成有效的JSON,我对这种方法持怀疑态度.应该使用理解结构化格式的工具来操纵结构化格式,而不是基本的面向行的工具; 但如果这有助于您将面向行的数据转换为适当的JSON,那么这可能是有效的用途.

...作为事后的想法,也许你想把输出包装在一组方括号中.然后它实际上是技术上有效的JSON(假设每一行都是一个有效的JSON片段).

sed '1s/^/[/;$!s/$/,/;$s/$/]/' file
Run Code Online (Sandbox Code Playgroud)

在第一行(地址表达式1)替换行(s/^/[/)开头的开始方括号.在不是最后一行的行上,添加一个尾随逗号,如上所述.在其上线最后一个(地址表达$)在一行的末尾添加一个闭括号(s/$/]/).如果您更喜欢换行符号,那就没问题; 许多sed方言也允许您将其拆分为多个-e参数.


Ed *_*ton 5

保持简单,只需使用 awk:

$ awk '{printf "%s%s",sep,$0; sep=",\n"} END{print ""}' file
{...},
{...},
{...},
{...}
Run Code Online (Sandbox Code Playgroud)

  • 把事情简单化?sed 的答案对我来说似乎要简单得多。 (8认同)
  • sed:“除最后一行之外的每一行,找到结尾并添加一个逗号。” 简单的。awk:“每一行先打印分隔符,然后是行,(等等,为什么先分隔符?)然后设置分隔符(为什么包括换行符?哦,必须是记录分隔符......),然后在最后,打印一个空行(什么?哦,向后的 RS/record 打印不会留下尾随的换行符)。” 你对“简单”的定义很奇怪。 (2认同)
  • 您可能需要在 END 块中使用一些条件代码来处理空文件。 (2认同)