我必须从包含没有任何分隔符的数据的文本文件创建一个 csv 文件。
好像:
2015021DUMMY001EAN1377689456777678945GERDE0002345
2015031DUMMY002EAN1345647876867867867TURTR0154565
......
有没有一种简单的方法可以在每行的每个 x、y 和 z 字符处插入分号,最好使用 bash 或 sed?
答案1
您可以使用 12、32 和 16 个字符的组(12+32=44、44+16=60):
sed 's/\(.\{12\}\)\(.\{32\}\)\(.\{16\}\)/\1;\2;\3/'
您的示例输入不包含 60 个字符(49 个字符,如果我没数错的话)。否则,仅使用 12 和 32:
$ sed 's/\(.\{12\}\)\(.\{32\}\)/\1;\2;/' input
2015021DUMMY;001EAN1377689456777678945GERDE00;02345
2015031DUMMY;002EAN1345647876867867867TURTR01;54565
...这可能是也可能不是您想要的。
一般来说,组的长度为 x、yx 和 zyx 字符。
或者您可以使用三个单独的替换:
sed 's/.\{12\}/&;/; s/.\{45\}/&;/; s/.\{62\}/&;/'
在这种情况下,长度将为 x、y+1(对于为 x 插入的分号)和 z+2。
答案2
sed 's/./&;/59; s//&;/43; s//&;/11' <in >out
我不确定你是否;
想要是一行中的第十二个、第四十四个或第六十个字符或跟随它。如果是后者,要么向所有这些数字加一,并冒着在行尾附加分号的风险(如果这很重要的话)或见下文。不过,正如上面所写,sed
如果还没有第 59 个字符,则不会附加第 60 个字符。
执行插入而不是附加:
sed 's/./;&/60; s//;&/44; s//;&/12' <in >out
...是另一种方式。在这种情况下,sed
永远不会在行尾附加分号 - 分号仅插入在第六十个字符位置(例如)如果这样做的话,肯定会有六十一。
这三种替代并不相互依赖。无论采用哪种编写方式,sed
都会根据行的长度添加一个、两个或三个分号。任何包含五十九或六十个字符的行将得到三个,至少长于四十二或四十三个字符的较短行得到两个分号,而其他至少匹配十一个或十二个字符的行仅编辑一次。少于 11 个字符的行不受影响。
如果您只想影响足够长以证明所有三个分号合理的行:
sed -e's/./;&/60;ts' -eb -e:s \
-e's//;&/44;s//;&/12' <in >out
...那会起作用的。
...与 GNUsed
(和minised
)你可以T
用 est 替代失败而不仅仅是为了成功:
sed -e's/./&;/59;T; s//&;/43; s/&;/12' <in >out