renombrado - renombrar lista de archivos linux
Reemplazar espacios en blanco con una coma en un archivo de texto en Linux (7)
Necesito editar algunos archivos de texto (una salida de sar
) y convertirlos en archivos CSV.
Necesito cambiar cada espacio en blanco (tal vez es una pestaña entre los números en la salida) usando funciones sed o awk (un script de shell fácil en Linux).
¿Alguien puede ayudarme? Cada comando que utilicé no cambió el archivo en absoluto; gsub
.
¿Qué tal algo así?
cat texte.txt | sed -e ''s//s/,/g'' > texte-new.txt
(Sí, con algunos catting inútiles y tuberías, también podría usar <para leer directamente del archivo, supongo - usé cat primero para generar el contenido del archivo, y solo después, agregué sed a mi línea de comandos)
EDITAR: como @ ghostdog74 señaló en un comentario, definitivamente no hay necesidad de thet cat / pipe; puedes dar el nombre del archivo a sed:
sed -e ''s//s/,/g'' texte.txt > texte-new.txt
Si "texte.txt" es de esta manera:
$ cat texte.txt
this is a text
in which I want to replace
spaces by commas
Obtendrás un "texte-new.txt" que se verá así:
$ cat texte-new.txt
this,is,a,text
in,which,I,want,to,replace
spaces,by,commas
No iría simplemente reemplazando el archivo anterior por el nuevo (podría hacerse con sed -i, si no recuerdo mal, y como dijo @ ghostdog74, este aceptaría crear la copia de seguridad sobre la marcha) : mantener podría ser sabio , como una medida de seguridad (incluso si eso significa tener que cambiarle el nombre a algo así como "texte-backup.txt")
Aquí hay un script de Perl que editará los archivos in situ:
perl -i.bak -lpe ''s//s+/,/g'' files*
El espacio en blanco consecutivo se convierte en una coma simple.
Cada archivo de entrada se mueve a .bak
Estas opciones de línea de comando se usan:
-i.bak
editar en el lugar y hacer copias .bak-p
bucle alrededor de cada línea del archivo de entrada, imprima automáticamente la línea-l
elimina las nuevas líneas antes del procesamiento y las agrega de nuevo en adelante-e
ejecuta el código perl
Este comando debería funcionar:
sed "s//s/,/g" < infile.txt > outfile.txt
Tenga en cuenta que debe redirigir la salida a un nuevo archivo. El archivo de entrada no se cambia en su lugar.
Pruebe algo como:
sed ''s/[:space:]+/,/g'' orig.txt > modified.txt
La clase de caracteres [: espacio:] coincidirá con todos los espacios en blanco (espacios, pestañas, etc.). Si solo quieres reemplazar un solo caracter, ej. solo espacio, use eso solo.
EDITAR: En realidad [: espacio:] incluye retorno de carro, por lo que puede que no haga lo que usted desea. Lo siguiente reemplazará pestañas y espacios.
sed ''s/[:blank:]+/,/g'' orig.txt > modified.txt
como lo hará
sed ''s/[/t ]+/,/g'' orig.txt > modified.txt
En todo esto, debe tener cuidado de que los elementos del archivo que están separados por espacios en blanco no contengan sus propios espacios en blanco que desee conservar, por ejemplo. dos palabras.
sed puede hacer esto:
sed ''s/[/t ]/,/g'' input.file
Eso se enviará a la consola,
sed -i ''s/[/t ]/,/g'' input.file
editará el archivo en el lugar
sin mirar su archivo de entrada, solo una conjetura
awk ''{$1=$1}1'' OFS=","
redirigir a otro archivo y cambiar el nombre según sea necesario
tr '' '' '','' <input >output
Sustituye cada espacio con una coma, si lo necesita, puede hacer un pase con el indicador -s (repeticiones de squeeze), que reemplaza cada secuencia de entrada de un carácter repetido que se enumera en SET1 (el espacio en blanco) con una sola aparición de ese personaje.
Uso de repeticiones de compresión usadas después de pestañas de sustitución:
tr -s ''/t'' <input | tr ''/t'' '','' >output