白痴客户正在生成csv文件,但有一个字段有时会在(描述字段)中有额外的逗号.
是否有一个整洁的正则表达式来找到这些不良记录并用其他东西替换额外的逗号. SED命令行没问题.
例:
A,B,C,This is a description,D,E F,G,H,This is a description with a comma (,) in it,E
我需要一个SED,可以告诉该行中有太多逗号,并从字段4中删除多余的逗号.
我们没有告诉愚蠢的客户改变他们的代码的奢侈.
解决方法
解决方案1:单行,删除,
在这里你使用SED单行:
sed -r 's/([^,],[^,)(.*)(,.+,.+)/\1'"$(sed -r 's/([^,.+)/\2/' <<< $myInput | sed 's/,//g')"'\3/' <<< $myInput
你必须替换<<< $myInput,无论您的实际输入是什么.
当您使用CSV时,您可能需要调整(同时出现)正则表达式以匹配CSV表格的每一行.
如果你的前三个和最后两个字段大于一个字符,用[^,] *替换[^,].
说明:
我们使用这个正则表达式
/([^,.+)/
它为我们捕获字符串的第一个(F,),第二个(.*)和最后一个部分(,E).
第一个和第三个捕获组将保持不变,而第二个捕获组将被替换.
对于替换,我们称sed为第二(实际上是第三)时间.首先我们只捕获第二组,第二组我们替换每一组,没有任何东西(仅在捕获组中!).
证明:
当然,如果没有不需要的逗号,则不会替换任何内容:
如果您只想指定一个文件,那么您可以使用该文件的每一行进行替换
while read line; do sed -r 's/([^,.+)/\2/' <<< $line | sed 's/,//g')"'\3/' <<< $line; done < input.txt
最后的input.txt是 – 显然 – 你的文件.
我只是在一个while循环中使用上面的SED命令,它读取文本的每一行.这是必要的,因为你必须跟踪你正在阅读的行,因为你在相同的输入上调用sed两次.
正如@Łukasz L.在对OP的评论中指出的那样,根据描述CSV文件格式的RFC1480,最好将包含逗号的字段包含在“.
这比其他解决方案更简单:
sed -r 's/([^,.*,.*)/\1"\2"\3/' input.txt
我们再次拥有三个捕获组.这允许我们简单地将第二组包装成“!