文件操作;插入一个“;”文本文件每行中的每 12、44 和 60 个字符

文件操作;插入一个“;”文本文件每行中的每 12、44 和 60 个字符

我必须从包含没有任何分隔符的数据的文本文件创建一个 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

相关内容