sed: ajout de texte à un décalage d’octet après la correspondance du motif

J’ai un fichier comme celui-ci:

113728482180.18408400639521053213728482180.18534013377161235313728482180.18527849814511801413728482180.12680711716571988513728482180.40802725786530114613728482180.039221670254883746713728482180.42748179436369843813728482180.45107192556631565913728482180.43916947404834661013728482180.12677684033447337

Comment append du texte (dans ce cas, un \n ) 11 caractères avant la position correspondant à 0. ?

Je veux finir avec quelque chose comme:

 113728482180.18408400639521053 213728482180.18534013377161235 313728482180.18527849814511801 413728482180.12680711716571988 513728482180.40802725786530114 613728482180.039221670254883746 713728482180.42748179436369843 813728482180.45107192556631565 913728482180.43916947404834661 013728482180.12677684033447337 

Je peux aussi résoudre les problèmes suivants. Le premier chiffre de chaque ligne est un compteur (1, 2, 3, …, 10, …, 10000, …). Le dernier chiffre de la 9ème ligne (qui est 1) doit également être inclus dans la 10ème ligne de sorte que cette ligne commence par 10 plutôt que par 0. Cela serait également nécessaire pour les 1000, 10000 et 100000.

C’est possible? Quelque chose comme, pour les lignes 1-9, le décalage serait de 11, pour les lignes 10-99, le décalage serait de 12, pour les lignes 100-999, le décalage serait de 13, et ainsi de suite.

Pour l’exemple ci-dessus, les deux dernières lignes deviendraient:

 913728482180.4391694740483466 1013728482180.12677684033447337 

Le compteur est séquentiel. Pour des nombres plus importants, de l’ordre de centaines et de milliers, append simplement les caractères de la nouvelle ligne 11 avant le match se terminerait comme ceci dans le cas des 10000:

 213728482180.43916947404831000 313728482180.12677684033441000 

Mais le but est d’obtenir:

 1000213728482180.4391694740483 1000313728482180.1267768403344 

essayez ceci: (gnu sed)

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

Exemple:

 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 

Que diriez-vous d’utiliser une boucle for de bash avec sed?

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

Vous pouvez remplacer le seq 2 10 par votre propre numéro N, seq 2 N , si connu à l’avance