首页 > 解决方案 > 在 bash 中将 CSV 输出为单个字符串,无需额外安装

问题描述

我有一个 CSV 文件,其中包含如下数据:

1, 2, 3
A, B, C
4, 5, 6

我试图在 bash 中将其输出为由换行符分隔的单个字符串,如下所示:

"1, 2, 3\nA, B, C\n4, 5, 6"

我尝试了很多方法,但还没有奏效。谢谢你的帮助!

编辑:

根据提供的答案,由于我的代码的其他用户可能需要相同的转换并且我不能保证他们的系统上有什么,仍然在寻找答案,而与我是否有无关:

  1. 安装了 GNU sed
  2. Windows 行尾与否
  3. dos2unix安装

标签: bash

解决方案


我不确定您是想在 bash 中使用预期的输出还是想在其他地方使用指定的输出。以下是两种情况的两个答案:

用引号替换换行符\n并添加周围的"引号

在这种情况下,您的问题是重复的——至少是用文字\ns 替换换行符的部分。最简单的解决方案是 sed -z 's/\n/\\n/g;s/.*/"&"/' yourFile提供 GNU sed
如果您的文件以换行符结尾(如文本文件通常那样),您的字符串也会:
"1, 2, 3\nA, B, C\n4, 5, 6\n"

如果您不想要尾随,\n您可以在实际处理之前将其排除:

sed -z 's/\n$//;s/\n/\\n/g;s/.*/"&"/' yourFile
"1, 2, 3\nA, B, C\n4, 5, 6"

在单行 bash 字符串中编码多行文件

printf使用 bash的内置%q格式。来自help printpf

%q以可以重用为 shell 输入的方式引用参数

要将文件内容传递给 printf,请使用 subshel​​l:

printf %q "$(< yourFile)"

这将使用 bash 的 C 字符串格式,因为在双引号字符串\n被视为换行符"..."

$'1, 2, 3\nA, B, C\n4, 5, 6'

推荐阅读