您可以指定要切割的外壳吗?

您可以指定要切割的外壳吗?

可能的重复:
有没有强大的命令行工具来处理 csv 文件?

我可以用来cut从文件中提取列:

$ cat foo
foo,bar,hello
bash,baz,world

$ cut -d\, -f2 foo
bar
baz

但是,如果列中有一个分隔符并且在这样的外壳内是安全的怎么办?

$ cat foo
foo,"hello, world",bar
bash,goodbye,baz

$ cut -d\, -f2 temp12
"hello
goodbye

有什么方法可以告诉我们尊重引号字符cut的包围吗?""

答案1

绝对不适合 GNU 剪切,至少:

/* The delimeter character for field mode. */ static unsigned char delim;

(如 GNU coreutils 源代码所示)

答案2

cut如果您首先预处理其输入以转义引号内的字符(例如,将引号内的“_”替换为“_u”,将“,”替换为“_c”,或者将每个字符替换为其 2 字节十六进制表示法,则可以做到这一点)并对它进行后处理以恢复转义。

就像是:

perl -pe 's/"(.*?)"/"\"".unpack("H*", $1)."\""/ge' |
  cut -d, -f2 |
  perl -pe 's/"(.*?)"/"\"".pack("H*",$1)."\""/ge'

(假设引号内(或外)没有转义引号)。

但是,考虑到它需要付出的努力,您最好使用适当的 csv 解析器或使用类似 perl 的正则表达式引擎来完成整个工作。

相关内容