Lo intenté grep -v '^$'
en Linux y eso no funcionó. Este archivo proviene de un sistema de archivos de Windows.
Lo intenté grep -v '^$'
en Linux y eso no funcionó. Este archivo proviene de un sistema de archivos de Windows.
Respuestas:
Intenta lo siguiente:
grep -v -e '^$' foo.txt
La -e
opción permite patrones de expresiones regulares para la coincidencia.
Las comillas simples ^$
hacen que funcione para Cshell. Otros proyectiles estarán contentos con comillas simples o dobles.
ACTUALIZACIÓN: Esto funciona para mí para un archivo con líneas en blanco o "todos los espacios en blanco" (como las líneas de Windows con terminaciones de línea de estilo "\ r \ n"), mientras que lo anterior solo elimina archivos con líneas en blanco y terminaciones de línea de estilo Unix:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, todo después -e
se interpreta como el patrón.
grep -v -e '^[[:space:]]*$' -e '^#' file
le dará todas las líneas no en blanco, sin comentarios en un script o archivo de configuración (o cualquier tipo de archivo que use el carácter hash para comentarios).
-e
opción permite patrones de expresiones regulares para la coincidencia". Eso es muy engañoso . -e
es una definición (POSIX-) para: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
(del manual ). Grep ya espera una expresión regular (básica) por defecto. Para este patrón, es posible dejar de lado -e
por completo: grep -v '^[[:space:]]*$' foo.txt
.
Mantenlo simple.
grep . filename.txt
Utilizar:
$ dos2unix file
$ grep -v "^$" file
O simplemente simplemente awk:
awk 'NF' file
Si no tiene dos2unix, puede usar herramientas como tr :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
grep -v "^[[:space:]]*$"
The -v makes it print lines that do not completely match
===Each part explained===
^ match start of line
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc.
* previous match (whitespace) may exist from 0 to infinite times
$ match end of line
Ejecutando el código
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
Para entender más acerca de cómo / por qué funciona esto, recomiendo leer sobre expresiones regulares. http://www.regular-expressions.info/tutorial.html
Prefiero usar egrep
, aunque en mi prueba con un archivo genuino con línea en blanco, su enfoque funcionó bien (aunque sin comillas en mi prueba). Esto también funcionó:
egrep -v "^(\r?\n)?$" filename.txt
Si tiene secuencias de varias líneas en blanco en una fila y solo desea una línea en blanco por secuencia, intente
grep -v "unwantedThing" foo.txt | cat -s
cat -s
suprime las líneas de salida vacías repetidas.
Su salida pasaría de
match1
match2
a
match1
match2
Las tres líneas en blanco en la salida original se comprimirían o "apretarían" en una línea en blanco.
Lo mismo que las respuestas anteriores:
grep -v -e '^$' foo.txt
Aquí, grep -e
significa la versión extendida de grep . '^ $' significa que no hay ningún carácter entre ^ (Inicio de línea) y $ (final de línea). '^' y '$' son caracteres regex.
Entonces, el comando grep -v
imprimirá todas las líneas que no coinciden con este patrón (sin caracteres entre ^ y $).
De esta forma, se eliminan las líneas en blanco vacías.
-e
no significa "la versión extendida de grep", ¿quizás te confunden -E
? El manual dice claramente que -e
solo dice explícitamente que sigue un patrón. Dado que el patrón no comienza con un guión, y de todos modos solo está definiendo un patrón, también podría omitirlo, ya que grep espera de manera predeterminada un patrón de expresión regular: grep -v '^$' foo.txt
(no es necesario contar con una funcionalidad de expresión regular extendida). También vale la pena mencionar que esto no elimina las líneas en blanco en el archivo, solo lo que se canaliza a través de la salida. Para ese caso, sed -i
sería la herramienta adecuada.
Lo intenté mucho, pero esto parece funcionar (suponiendo \r
que te muerda aquí):
printf "\r" | egrep -xv "[[:space:]]*"
Usando Perl:
perl -ne 'print if /\S/'
\S
significa emparejar caracteres no en blanco.
egrep -v "^ \ s \ s +"
egrep ya hace expresiones regulares, y el \ s es un espacio en blanco.
El + duplica el patrón actual.
El ^ es para el comienzo
Utilizar:
grep pattern filename.txt | uniq
uniq
reducirá las líneas en blanco adyacentes a una sola línea en blanco, pero no las eliminará por completo. Aún así, me gusta tratar de usar uniq
así. Ordenar primero eliminaría efectivamente todas las líneas en blanco, dejando solo una, pero reorganizar el orden de las líneas puede no ser aceptable.
Aquí hay otra forma de eliminar las líneas blancas y las líneas que comienzan con el #
signo. Creo que esto es bastante útil para leer archivos de configuración.
[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults requiretty
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
stack ALL=(ALL) NOPASSWD: ALL
Es cierto que el uso de grep -v -e '^ $' puede funcionar, sin embargo , no elimina las líneas en blanco que tienen 1 o más espacios . Encontré que la respuesta más fácil y más simple para eliminar líneas en blanco es el uso de awk . Lo siguiente es un poco modificado de los chicos de awk anteriores:
awk 'NF' foo.txt
Pero como esta pregunta es para usar grep, voy a responder lo siguiente:
grep -v '^ *$' foo.txt
Nota : el espacio en blanco entre ^ y *.
O puede usar \ s para representar un espacio en blanco como este:
grep -v '^\s*$' foo.txt