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