如何查找并替换为新行?

如何查找并替换为新行?

我有一个用逗号分隔的 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,cis a single field”之类的问题,那么事情就会变得更加困难

答案3

POSIX 允许但不强制在 sed 中的替换文本\n中使用。 sGNU 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

相关内容