¿Cómo eliminar líneas en blanco con VIM y Sed?

0
2056

Para eliminar todas las líneas en blanco de un archivo de texto con el editor VIM, podemos usar cualquier de los siguientes dos comandos.

  • :%s/^\n//g  —> Elimina lineas en blanco
  • :g/^\s*$/d   —> Elimina lineas en Blanco
  • :%s/\r/\r/g   —> Elimina los ^M
  • :%g/^$/d    —> Elimina lineas vacias del archivo en cuestion

Como habran visto, existen diferentes combinaciones para eliminar lineas en blanco de un archivo.

Con el comando Sed seria:

Para eliminar lineas en blanco, donde la opción de sed para eliminar es d.

  • sed ‘/^$/d’

Asi que para eliminar las líneas en blanco de un archivo llamado nomarch:

  • sed ‘/^$/d’ nomarch

Si queremos redireccionar el resultado a un nuevo archivo llamado nomarch1 ejecutaríamos lo siguiente:

  • $ sed ‘/^$/d’ nomarch >nomarch1

Así no modificaríamos el archivo original y tendríamos el archivo sin líneas en blanco en nomarch1. Ahora bien, eliminar líneas que contengan un patrón o palabra específico

Supongamos que queremos eliminar todas las líneas que contienen la palabra Windows de un archivo llamado nomarch2. Para esto ejecutamos:

  • sed ‘/Windows/d’ nomarch2 > nomarch3

Aquí redireccionamos el resultado a un nuevo archivo llamado nomarch3

También existe otro método para eliminar caracter ^M de un archivo en Linux

El día de hoy pretendía ejecutar unos scripts ( creados en windows) en linux, y estos fallaron debido a que los scripts contenían ^M al final de cada linea.

Bien en Windows los archivos se almacenan en codificación ascii y en linux en unicode, es por esto que pasa este problema. Para eliminar este caracter basta con abrir el archivo con el editor vi y hacer lo siguiente:

En modo comando escribimos:

:%s/^M//g

y listo se eliminará el caracter ^M.

Pero también podemos auxiliarnos de la función tr -d “\r” en el prompt de linux para eliminarlo:

cat archivo.txt|tr -d "\r" >archivo.tmp
mv archivo.tmp archivo.ext

Si tenemos varios archivos es un directorio podemos auxiliarnos de un for, para eliminar el caracter de todos los archivos:

for i in $(ls -1);
do
cat $i|tr -d "\r" >temporal.tmp
mv temporal.tmp $i
done

 

Sencillo, o no ???

LEAVE A REPLY

Please enter your comment!
Please enter your name here