【问题标题】:Output CSV as a single string in bash without extra installations [duplicate]在 bash 中将 CSV 输出为单个字符串,无需额外安装 [重复]
【发布时间】:2020-03-18 15:41:18
【问题描述】:

我有一个包含如下数据的 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

【问题讨论】:

  • 因为我什至无法回答自己的问题......这就是最终对我有用的方法:var=$(tr '\r\n' '\\n' < input.csv) 然后echo "$var:q" > output.txt

标签: bash


【解决方案1】:

Boththese 问题采用完全相同的方法来完成此任务。

这应该只是将“,”换成文字“\n”的问题,你可以用\\n来做

编辑:如果链接失效,则来自先前答案的相关解决方案如下。这个答案完全归功于Zsolt Botykai,我已针对您的特定用例进行了修改:

将此解决方案与 GNU sed 一起使用:

sed ':a;N;$!ba;s/\n/\\n/g' file

这将循环读取整个文件, 然后用空格替换换行符。

解释:

  1. 通过:a 创建标签。
  2. 将当前行和下一行附加到模式中 空间通过N
  3. 如果我们在最后一行之前,跳转到创建的 label $!ba ($! 表示不要在最后一行做,因为应该有 最后一个换行符)。
  4. 最后替换替换每个换行符 在模式空间(即整个文件)上有一个空格。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 很好,感谢您指出这一点@shalomb!我已经修改了我的答案,以包含所提供链接中答案的相关部分。
  • @DavidAllewell 不幸的是,这只是给了我与我最初拥有的表格完全相同的输出。
  • @Frankie 真的吗?我得到了要求的结果。你能显示一个终端输出吗?您使用的是什么版本的 Bash(我假设 Bash)。 CSV 文件中是否有回车符?
【解决方案2】:

我不确定您是想在 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 字符串中编码多行文件

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

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

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

printf %q "$(< yourFile)"

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

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

【讨论】:

  • 不幸的是,第一个选项给了我sed: illegal option -- z,第二个选项给了我1,2,3$'\r'$'\n'A,B,C$'\r'$'\n'4,5,6%。对不起,我不太明白!
  • 该错误表明您没有 GNU sed 而是另一个版本。第二个输出显示您的文件不使用 linux 行尾 \n,但 windows 行尾 \r\n。将文件转换为 linux 行结尾(使用 dos2unix 工具),然后使用标记的重复项将 \n 替换为 \\n 使用 sed 's/\r/\\n/' yourFile | tr -d '\n'
猜你喜欢
  • 2016-05-17
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2021-01-27
  • 2012-12-02
相关资源
最近更新 更多