Manipulación de files; Inserta un ";" cada 12 °, 44 ° y 60 ° carácter en cada línea de un file de text

Tengo que hacer un file csv desde un file de text que contiene datos sin ningún delimitador.

Parece:

2015021DUMMY001EAN1377689456777678945GERDE0002345 2015031DUMMY002EAN1345647876867867867TURTR0154565 ...... 

¿Hay alguna manera fácil de insert un punto y coma en cada carácter x, y y z en cada línea, preferiblemente usando bash o sed?

Puede usar grupos de 12, 32 y 16 caracteres (12 + 32 = 44, 44 + 16 = 60):

 sed 's/\(.\{12\}\)\(.\{32\}\)\(.\{16\}\)/\1;\2;\3/' 

Su input de muestra no contiene 60 caracteres (49, si obtuve mi conteo correcto). De lo contrario, usando solo 12 y 32:

 $ sed 's/\(.\{12\}\)\(.\{32\}\)/\1;\2;/' input 2015021DUMMY;001EAN1377689456777678945GERDE00;02345 2015031DUMMY;002EAN1345647876867867867TURTR01;54565 

… que puede o no ser lo que querías.

En general, los grupos serían caracteres x, yx y zyx de largo.

O puede usar tres sustituciones por separado:

 sed 's/.\{12\}/&;/; s/.\{45\}/&;/; s/.\{62\}/&;/' 

En este caso, las longitudes serían x, y + 1 (para el punto y coma insertado para x) y z + 2.

 sed 's/./&;/59; s//&;/43; s//&;/11' <in >out 

No estoy seguro si quieres el ; ser el duodécimo, cuadragésimo cuarto, o sexagésimo carácter en una línea o seguirlo . Si es el último, agregue uno a todos esos numbers y arriesgue agregar un punto y coma al final de la línea (si eso importa) o vea abajo. Como está escrito, arriba, sin embargo, sed no agregará un sexagésimo carácter si no hay un cincount y nueve.

Para hacer inserciones en lugar de anexar:

 sed 's/./;&/60; s//;&/44; s//;&/12' <in >out 

… es otra forma. En este caso, sed nunca agregará un punto y coma a la queue de la línea; los puntos y comas solo se insertan en la position del sexagésimo carácter (por ejemplo) si después de hacerlo definitivamente habrá un sesenta y uno.

Las tres sustituciones no son mutuamente dependientes. De cualquier forma que se escriba, sed agregará uno, dos o tres puntos y coma a una línea dependiendo de su longitud. Cualquier línea con cincount y nueve o sesenta caracteres obtendrá tres, líneas más cortas que son, al less, más largas que cuarenta y dos o cuarenta y tres caracteres, dos puntos y coma, y ​​otras líneas que coincidan con al less once o doce caracteres se editen solo una vez. Las líneas con less de once caracteres no se ven afectadas.

Si solo desea afectar las líneas que fueron lo suficientemente largas como para justificar los tres puntos y comas:

 sed -e's/./;&/60;ts' -eb -e:s \ -e's//;&/44;s//;&/12' <in >out 

…eso funcionaria.

… con un minised GNU (y minised ) puede T est una sustitución por falla en lugar de solo por éxito también:

 sed -e's/./&;/59;T; s//&;/43; s/&;/12' <in >out