sed:匹配模式后在某个字节偏移处添加文本

时间:2013-07-03 11:11:40

标签: unix sed

我有一个这样的文件:

113728482180.18408400639521053213728482180.18534013377161235313728482180.18527849814511801413728482180.12680711716571988513728482180.40802725786530114613728482180.039221670254883746713728482180.42748179436369843813728482180.45107192556631565913728482180.43916947404834661013728482180.12677684033447337

如何在匹配\n的位置之前添加文字(在本例中为0.)11个字符?

我想最终得到类似的东西:

113728482180.18408400639521053
213728482180.18534013377161235
313728482180.18527849814511801
413728482180.12680711716571988
513728482180.40802725786530114
613728482180.039221670254883746
713728482180.42748179436369843
813728482180.45107192556631565
913728482180.43916947404834661
013728482180.12677684033447337

我有可能,我还想解决以下问题。每行的第一个数字是计数器(1,2,3,...,10,...,10000,......)。第9行的最后一位(也就是1)也应该包含在第10行中,以便该行以10开始,而不是0.这对于1000s,10000s和100000s也是必要的。

有可能吗?对于第1-9行,偏移量为11,对于第10-99行,偏移量为12,对于行100-999,偏移量为13,依此类推。

对于上面的示例,最后两行将成为:

913728482180.4391694740483466
1013728482180.12677684033447337

计数器是顺序的。对于较大的数字,大约数百和数千,只需在匹配之前添加换行符11个字符就像10000s那样结束:

213728482180.43916947404831000
313728482180.12677684033441000

但目的是获得:

1000213728482180.4391694740483
1000313728482180.1267768403344

2 个答案:

答案 0 :(得分:4)

试试这个:( gnu sed)

 sed -r 's/([^.]{12}\.)/\n\1/2g' file

示例:

kent$  sed -r 's/([^.]{12}\.)/\n\1/2g' a
113728482180.18408400639521053
213728482180.18534013377161235
313728482180.18527849814511801
413728482180.12680711716571988
513728482180.40802725786530114
613728482180.039221670254883746
713728482180.42748179436369843
813728482180.45107192556631565
913728482180.43916947404834661
013728482180.12677684033447337

答案 1 :(得分:0)

如何在sed中使用bash的for循环?

str="..."
for II in `seq 2 10`; do
  str=`echo $str | sed -e 's#\('$II'13728482180\.\)# \1#'`
done
echo $str | tr ' ' '\n'

如果事先知道,您可以用自己的号码N seq 2 10替换seq 2 N