我有一个用逗号分隔的 CSV,我想用换行符分隔它。
输入:
a, b, c
输出:
a
b
c
我已经编写了执行此操作的 Java 解析器,但是不能使用vim
其他工具来完成此操作吗?
sed
不适合我:
#!/bin/sh
# Start
cat > infile.csv << __EOF__
a, b, c
__EOF__
cat infile.csv
sed 's/, /\n/g' infile.csv > outfile.csv
cat outfile.csv
答案1
似乎其他答案达到了您想要的效果,而可编写脚本的工具似乎是最合适的选择。
但你问的是 vim,所以你可以这样做:
%s/, /\r/g
即,将每个逗号+空格替换为回车符。然后,这将被解释为文件的适当行结束字符。 (您可以通过搜索来检查\r
- 它不会被发现)。
答案2
如同伊恩的回答,您还可以使用tr
:
$ echo a,b,c | tr ',' '\n'
a
b
c
这两个答案都假设 CSV 很简单(即所有逗号都是字段分隔符)。如果你有诸如a,"b,c",d
“where b,c
is a single field”之类的问题,那么事情就会变得更加困难
答案3
POSIX 允许但不强制在 sed 中的替换文本\n
中使用。 s
GNU sed 可以做到这一点,但也有一些实现\n
按字面输出。
您可以使用任何兼容 POSIX 的 awk。将输入字段分隔符设置FS
为正则表达式,将输出字段分隔符设置ORS
为字符串(使用通常的反斜杠转义)。需要进行分配$1=$
来重建行以使用不同的字段分隔符。
awk -vFS=', *' -vOFS='\n' '{$1=$1; print}'
(这假设您的输入包含纯逗号和空格分隔的值,没有任何引号。如果有引号,您需要使用 Perl 或 Python 等语言使用真正的 CSV 解析器。)
答案4
使用乐(以前称为 Perl_6)
perl6 -pe 's:g/ "," \s /\n/;'
#OR
perl6 -ne '.split(", ").join("\n").put;'
另外,如果您担心嵌入的换行符、引号内的逗号等,请使用 Raku 的Text::CSV
模块:
raku -MText::CSV -e '.join("\n").put for csv(in => lines, sep => ", ");'
输入示例:
a, b, c
示例输出(上面的所有代码):
a
b
c
https://unix.stackexchange.com/a/701805/227738
https://raku.org