Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Sed基于引号进行拆分,处理引号中的逗号以及多个引号中不带逗号的数据_Linux_Shell_Unix_Awk_Sed - Fatal编程技术网

Linux Sed基于引号进行拆分,处理引号中的逗号以及多个引号中不带逗号的数据

Linux Sed基于引号进行拆分,处理引号中的逗号以及多个引号中不带逗号的数据,linux,shell,unix,awk,sed,Linux,Shell,Unix,Awk,Sed,我有如下数据 123,"john,test",John"test,""john"",345 以上需要按照以下方式进行拆分 123 "john,test" John"test ""john"" 345 我尝试在拆分时使用sed处理引号内的逗号,但对于多个双引号内的数据,显示不正确。而且中间有双引号的数据也没有得到处理。我尝试过使用awk,但无法使用fpat功能,因为我们有旧版本的awk 您能为同样的解决方案提供帮助吗?sed仅用于单个线路上的简单替代,仅此而已。对于任何其他问题,例如您

我有如下数据

123,"john,test",John"test,""john"",345
以上需要按照以下方式进行拆分

123

"john,test"

John"test

""john""

345
我尝试在拆分时使用sed处理引号内的逗号,但对于多个双引号内的数据,显示不正确。而且中间有双引号的数据也没有得到处理。我尝试过使用awk,但无法使用fpat功能,因为我们有旧版本的awk


您能为同样的解决方案提供帮助吗?

sed仅用于单个线路上的简单替代,仅此而已。对于任何其他问题,例如您的问题,您应该使用awk。请参阅,了解如何在任何awk中稳健地处理CSV,即使字段包含换行符,但解决了您的具体问题-您说过您不能使用FPAT,但FPAT只是任何awk中一段时间的GNU速记(match())循环,因此如果您不能这样做:

$ awk -v FPAT='[^,]+|"[^"]+"' '{for (i=1; i<=NF;i++) print i, "<" $i ">"}' file
1 <123>
2 <"john,test">
3 <John"test>
4 <""john"">
5 <345>
$awk-vfpat='[^,]+|“[^”]+'''{for(i=1;i
4.
5.

sed仅用于在单个行上进行简单的替换。对于任何其他问题,例如您的问题,您都应该使用awk。有关如何在任何awk中稳健地处理CSV的信息,请参阅,即使字段包含换行符,但说明您的具体问题-您说过您不能使用FPAT,但FPAT只是GNU的一个缩写(match())在任何awk中循环,因此如果无法执行此操作:

$ awk -v FPAT='[^,]+|"[^"]+"' '{for (i=1; i<=NF;i++) print i, "<" $i ">"}' file
1 <123>
2 <"john,test">
3 <John"test>
4 <""john"">
5 <345>
$awk-vfpat='[^,]+|“[^”]+'''{for(i=1;i
4.
5.
这可能适合您(GNU-sed):

将所有未被双引号括起的逗号替换为换行符

更深入:将不包含双引号或逗号的零个或多个字符分组,后跟零个或多个双引号组,后跟零个或多个非双引号字符(可能是逗号),后跟双引号,后跟零个或多个不包含双引号的字符,后跟逗号,并用换行符替换最后一个逗号。在整个文件中全局执行此操作

现在,如果双引号或逗号被引用…

这可能适用于您(GNU-sed):

将所有未被双引号括起的逗号替换为换行符

更深入:将不包含双引号或逗号的零个或多个字符分组,后跟零个或多个双引号组,后跟零个或多个非双引号字符(可能是逗号),后跟双引号,后跟零个或多个不包含双引号的字符,后跟逗号,并用换行符替换最后一个逗号。在整个文件中全局执行此操作


现在,如果双引号或逗号被引用…

请始终将您的示例(输入和输出)包装到代码标记中,并始终在您的帖子中显示您的努力(您试图解决问题)。@jww刚刚再次对问题和所有答案投了否决票,因此我将再次对其进行表决以进行补偿。始终包装您的示例(输入和输出)在你的帖子中,代码标签+总是显示你的努力(你试图解决这个问题)。@jww刚刚再次否决了这个问题和所有答案,所以我再次向上投票以补偿。
sed -r 's/([^",]*("[^"]*"[^",]*)*),/\1\n/g' file