linux - una - sed delete line
Eliminar líneas vacías usando sed (12)
Estoy tratando de borrar líneas vacías usando sed:
sed ''/^$/d''
Pero no tengo suerte con ello.
Por ejemplo, tengo estas líneas:
xxxxxx
yyyyyy
zzzzzz
y quiero que sea como
xxxxxx
yyyyyy
zzzzzz
¿Cuál debería ser el código para esto?
Con la ayuda de la respuesta aceptada aquí y la respuesta aceptada anterior, he usado:
$ sed ''s/^ *//; s/ *$//; /^$/d; /^/s*$/d'' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^/s*$/d` => delete lines which may contain white space
Esto cubre todas las bases y funciona perfectamente para mis necesidades. Felicitaciones a los carteles originales @Kent y @kev
Creo que este es el más fácil y rápido:
cat file.txt | grep .
Si también necesitas ignorar todas las líneas de espacios en blanco, prueba esto:
cat file.txt | grep ''/S''
Ejemplo:
s="/
/
a/
b/
/
Below is TAB:/
/
Below is space:/
/
c/
/
"; echo "$s" | grep . | wc -l; echo "$s" | grep ''/S'' | wc -l
salidas
7
5
Es muy probable que vea un comportamiento inesperado porque su archivo de texto se creó en Windows, por lo que la secuencia de final de línea es /r/n
. Puede usar dos2unix para convertirlo en un archivo de texto de estilo UNIX antes de ejecutar sed o usar
sed -r "/^/r?$/d"
para eliminar líneas en blanco ya sea que el retorno de carro esté o no allí.
Esto funciona en awk también.
awk ''!/^$/'' file
xxxxxx
yyyyyy
zzzzzz
Me falta la solución awk
:
awk ''NF'' file
Lo que volvería:
xxxxxx
yyyyyy
zzzzzz
¿Como funciona esto? Como NF
significa "número de campos", las líneas que están vacías tienen 0 fiedls, por lo que awk evalúa 0 en Falso y no se imprime ninguna línea; sin embargo, si hay al menos un campo, la evaluación es Verdadera y hace que awk
realice su acción predeterminada: imprimir la línea actual.
Mi respuesta específica a bash
es recomendar el uso del operador de sustitución perl
con el indicador global de patrón g
para esto, de la siguiente manera:
$ perl -pe s''/^/n|^[/ ]*/n//g'' $file
xxxxxx
yyyyyy
zzzzzz
Esta respuesta ilustra la contabilidad de si las líneas vacías tienen o no espacios en ellas ( [/ ]*
), así como el uso de |
para separar varios términos / campos de búsqueda. Probado en macOS High Sierra y CentOS 6/7.
Para su información, el sed ''/^$/d'' $file
original del código de sed ''/^$/d'' $file
funciona bien en bash
Terminal en macOS High Sierra y CentOS 6/7 Linux en un clúster de supercomputación de alto rendimiento.
Para mí, con FreeBSD 10.1 con sed trabajé solo esta solución:
sed -e ''/^[ ]*$/d'' "testfile"
Dentro de []
hay símbolos de espacio y tabulación.
archivo de prueba contiene:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============
Puede tener espacio / tabulaciones en su línea "vacía". Si es así, esto ayudará:
sed ''/^/s*$/d''
Esto utiliza /s
para que coincida con cualquier carácter de espacio en blanco.
Puedes decir:
sed -n ''/ / p'' filename #there is a space between ''//''
Puedes hacer algo así usando "grep", también:
egrep -v "^$" file.txt
sed ''/^$/d''
debería estar bien, ¿espera modificar el archivo en su lugar? Si es así debes usar la bandera -i
.
Tal vez esas líneas no estén vacías, así que si ese es el caso, mira esta pregunta Eliminar líneas vacías de txtfiles, eliminar espacios desde el principio y el final de la línea Creo que eso es lo que estás tratando de lograr.