如何在除最后一行之外的每一行末尾添加逗号?
Posted
技术标签:
【中文标题】如何在除最后一行之外的每一行末尾添加逗号?【英文标题】:How can I add a comma at the end of every line except the last line? 【发布时间】:2016-05-03 11:16:20 【问题描述】:我想在这种文件的每一行末尾添加一个逗号,除了最后一行:
我现在有这个:
...
...
...
...
我想要这个:
...,
...,
...,
...
我怎样才能用命令行来做呢? sed命令可以吗?
【问题讨论】:
这不会使它成为有效的 JSON。 你可能从 foreach 循环中调用你的 JSON,所以没有preg_replace
是不可能的
【参考方案1】:
vim <file-name>
:%s/$/,/g
删除
:%s/,//g
【讨论】:
【参考方案2】:下面的sed
脚本有一个地址表达式$!
,它匹配不是最后一行的行,还有一个替换操作s/$/,/
,它在行尾旁边添加一个逗号。
sed '$!s/$/,/' file
(地址中的$
指的是最后一个行,而正则表达式中的$
是指每行的最后一个字符位置线。它们是不相关的,尽管在某种意义上是相似的。)
这会将file
的修改内容打印到标准输出;重定向到不同的文件以将它们保存到文件中,或者如果您的sed
支持,则使用sed -i
。 (某些变体需要 -i
选项的空参数,特别是 *BSD / OSX sed
。)
如果您的任务是从不是的东西生成有效的 JSON,我对这种方法持怀疑态度。结构化格式应该使用理解结构化格式的工具来操作,而不是基本的面向行的工具;但如果这有助于您将面向行的数据转换为正确的 JSON,那可能是一种有效的用途。
... 作为事后的想法,也许您也想将输出包装在一组方括号中。然后它实际上是技术上有效的 JSON(假设每一行本身都是一个有效的 JSON 片段)。
sed '1s/^/[/;$!s/$/,/;$s/$/]/' file
在第一行(地址表达式1
)替换行首的方括号(s/^/[/
)。在不是最后一行的行上,添加一个尾随逗号,如上所述。在是最后一行(地址表达式$
)在行尾添加一个右方括号(s/$/]/
)。如果您更喜欢换行符而不是分号,那很好;许多sed
方言还允许您将其拆分为多个-e
参数。
【讨论】:
我想要 -i 但不起作用,这是正确的命令吗?sed -i '$!s/$/,/' file
太棒了!我用这个技巧制作了一个小脚本,将 JSON 行文件导出到 JSON 文件,像这样./jl2json.sh sample.jsonl sample.json
调用它。看这里gist.github.com/mrsarm/24e8531ef8375c768e03d1c1aea67262
@tripleee 有没有这个的 powershell 脚本?
@Dip 我不知道,但我想答案是肯定的。
@Dip 你找到在powershell上做的方法了吗?【参考方案3】:
保持简单,只需使用 awk:
$ awk 'printf "%s%s",sep,$0; sep=",\n" ENDprint ""' file
...,
...,
...,
...
【讨论】:
保持简单? sed 的答案对我来说似乎要简单得多。 sed: "除最后一行外的每一行,找到结尾并添加一个逗号。"简单的。 awk:“每一行打印分隔符,然后是行,(等等,为什么要先分隔符?)然后设置分隔符(为什么要包含换行符?哦,必须是记录分隔符......),然后在最后,打印一个空行(什么?哦,向后的 RS/记录打印不会留下尾随的换行符)。你对“简单”的定义很奇怪。 您可能需要在 END 块中添加一些条件代码来处理空文件。 这有点不直观的原因是它利用了awk
不关心变量是否未定义,它只是将其视为空的事实。所以,当第一行被处理时,没有“sep”,所以你不会得到一个开头只有一个逗号的行(正如你对这个脚本的简单阅读所期望的那样。跨度>
这个答案对我帮助很大,因为我已经在一个 awk 程序中,所以 sed 方法不是一个选项。谢谢,埃德!【参考方案4】:
你可以这样使用:
sed 's/$/,/' file.txt > file_with_added_commas.txt
这会将行尾替换为“,”并将其写入 file_with_added_commas.txt
更多信息请参考:add text at the end of each line
【讨论】:
这也会在最后一行添加一个逗号,OP 不需要。 这会在文件的所有行中添加一个逗号以上是关于如何在除最后一行之外的每一行末尾添加逗号?的主要内容,如果未能解决你的问题,请参考以下文章