Programando en Perl

Buenas gente, necesito una mano con este tema que es bastante complejo, y todavía no doy con el clavo.

La idea es que necesito sustituir caracteres de un archivo que contiene texto plano, además de otros caracteres correspondientes a otras cosas (llamémosles basura).
El fichero contiene caracteres \n (en hex 0A) que no son realmente saltos de línea, aunque cualquier aplicación así lo interpreta.

Básicamente la estructura es:

Mezcla de texto plano con caracteres de control sin sentido y 0A entremezclados
"Basura", sin texto legible.

La manera que tengo para definir el inicio de la basura es con el carácter F0, que durante el texto plano no aparece. Lo que he intentado es hacer un split usando ese carácter como marcador, pero sin éxito, a pesar de hacerlo de varias maneras.

Entonces, en resumidas cuentas lo que necesito es:

Que localice el archivo que existe de entre varios disponibles y lo abra [HECHO]
División del archivo en texto plano y basura
Sustitución de caracteres en texto plano [HECHO]
Reensamblaje de ambas partes e impresión en el mismo archivo

Si alguno me puede echar una mano os lo agradecería, y así entre todos lo vamos sacando :)
¿puesdes poner un ejemplo del archivo y como lo querrias?
Pongo una captura del final de la parte de texto plano y el comienzo de la "basura", si es necesario subo el archivo para toquetear y tal.

Imagen

La idea es que debe quedar igual, pero con los caracteres sustituidos.

Remarcar que es mi primera vez con Perl y no tengo apenas conocimientos ni soltura con él, es muy posible que erre en algún concepto o método.
No sé si entiendo bien lo que pretendes hacer, pero bueno, ahí te va un pequeño snippet que reemplaza los caracteres \n por almohadillas

echo -en  "linea1\nlinea2\n" | perl -pi -e 's/\n/#/'


Por cierto, puedes ahorrarte el perl (si no es un requisito) y tirar de cosas mas simples, como por ejempo el comando tr:

echo -en  "linea1\nlinea2\n" | tr "\n" "#"


Edito: parece que estás en windows, por la captura esa, osea que el comando tr, a no ser que hayas instalado algo como cygwin no lo tendrás
Si, estoy en Windows por "exigencias del guión", pero tengo Ubuntu instalado :D lo que pasa es que no puedo hacer la sustitución en todo el archivo, sólo en la parte del texto plano. Por eso necesito la división en dos partes.
largeroliker escribió:Si, estoy en Windows por "exigencias del guión", pero tengo Ubuntu instalado :D lo que pasa es que no puedo hacer la sustitución en todo el archivo, sólo en la parte del texto plano. Por eso necesito la división en dos partes.


¿ Como identificas cúal es la parte del texto plano ? (osea, la averiguas "a mano" tú, conoces los delimitadores...)

¿ Puede haber varias partes de texto plano ?

Si la respuesta de la pregunta anterior es si, ¿ quieres reemplazar el \n en todas ellas ?

En cualquier caso, la solución pasa por abrir el archivo (en Perl), hacerle un seek a la posición donde comienza el delimitador de texto, y a partir de ahí, recorrer con un simple bucle byte a byte e ir mirando si te coincide con un \n y reemplazarlo por el que sea (hablamos de reemplazar un caracter por otro ¿ no ?), así hasta que encuentres tu delimitador de fin de texto o hayas llegado al fin de archivo.
Sólo hay una parte de texto plano y otra de basura, es asi siempre. Lo que ocurre es que necesitaría ignorar los /n, pero no lo logro. La idea es tomar todo el archivo como continuo, no interpretando los /n, y hacer las sustituciones hasta el primer F0.
6 respuestas