使用awk或sed在文件的特定索引处插入char

时间:2015-10-22 10:14:12

标签: regex linux bash awk sed

是否有一种Linux方式(awk,sed,grep等)在文件的每一行中的特定索引处插入一个字符?

例如,下面是file.txt的内容

0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+00001+99999999999
0043011990999991950051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+00221+99999999999

我想在file.txt中的每一行的给定索引(比如15,19,88和93)处插入逗号,以便结果如下:

006701199099999,1950,051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+,00001,+99999999999
004301199099999,1950,051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+,00221,+99999999999

3 个答案:

答案 0 :(得分:1)

在sed中最简单

sed 's/\(.\{93\}\)/&,/;s/\(.\{88\}\)/&,/;s/\(.\{19\}\)/&,/;s/\(.\{15\}\)/&,/' YourFile

订单很重要,或者您需要记住下一次更改的附加字符

你可以马上做,但需要一些解释

sed 's/\(.\{15\}\)\(.\{4\}\)\(.\{69\}\)\(.\{5\}\)/\1,\2,\3,\4/' YourFile

答案 1 :(得分:0)

Perl解决方案:

perl -ne '$l = $_;
          substr $l, $_, 0, "," for reverse 15, 19, 88, 93;
          print $l' < input > output

我使用了reverse,因为你需要从右边开始 - 否则,每次插入后,所有剩余的索引都必须递增。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed 's/./&,/93;s/./&,/88;s/./&,/19;s/./&,/15' file