Estoy tratando de eliminar líneas vacías usando sed:
sed '/^$/d'
pero no tengo suerte con eso.
Por ejemplo, tengo estas líneas:
xxxxxx
yyyyyy
zzzzzz
y quiero que sea así:
xxxxxx
yyyyyy
zzzzzz
¿Cuál debería ser el código para esto?
Respuestas:
Puede tener espacios o pestañas en su línea "vacía". Utilice las clases POSIX con
sed
para eliminar todas las líneas que contienen solo espacios en blanco:Una versión más corta que usa ERE, por ejemplo con gnu sed:
(Tenga en cuenta que sed NO es compatible con PCRE).
fuente
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,^\s*$
coincidirá con todas las líneas "vacías", vacío aquí significa que la línea no contiene caracteres, o la línea solo contiene cadenas vacías (por ejemplo, espacios). Sed eliminará todas las líneas coincidentes con eld
comando.Me falta la
awk
solución:Que volvería:
¿Como funciona esto? Como
NF
significa "número de campos", las líneas que están vacías tienen 0 fiedls, de modo que awk evalúa 0 como False y no se imprime ninguna línea; sin embargo, si hay al menos un campo, la evaluación es True y hace queawk
realice su acción predeterminada: imprimir la línea actual.fuente
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
¿Conocería una manera ingeniosa de incluir esto en un guión awk como, por ejemplo, un patrón? awk '/ mypattern / {do stuff ...}'awk 'NF {do stuff...}'
.sed '/^$/d'
debería estar bien, ¿espera modificar el archivo en su lugar? Si es así, debe usar el-i
bandera.Tal vez esas líneas no estén vacías, así que si ese es el caso, mire esta pregunta Elimine las líneas vacías de los archivos txt, elimine los espacios desde el inicio y el final de la línea . Creo que eso es lo que está tratando de lograr.
fuente
sed -i '/^$/d'
Es una forma de hacerlo.sed
'/^[[:space:]]*$/d'
'/^\s*$/d'
'/^$/d'
-n '/^\s*$/!p'
grep
.
-v '^$'
-v '^\s*$'
-v '^[[:space:]]*$'
awk
/./
'NF'
'length'
'/^[ \t]*$/ {next;} {print}'
'!/^[ \t]*$/'
fuente
[]
deben no ser escaparon en una expresión entre corchetes, por lo que el código aquí no es correcto para\[\[:space:\]\]
o\[ \t\]
- debe ser[[:space:]]
y[ \t]
.Creo que este es el más fácil y rápido:
Si necesita ignorar también todas las líneas de espacios en blanco, intente esto:
Ejemplo:
salidas
fuente
cat
,grep
toma archivos también:grep . file.txt
grep '\S'
Definitivamente no es portátil. Si esgrep -P
así, puede usarlo,grep -P '\S'
pero tampoco es compatible con todas las plataformas.grep .
las otras soluciones es que resaltará todo el texto en rojo. Las otras soluciones pueden preservar los colores originales. Compareunbuffer apt search foo | grep .
conunbuffer apt search foo | grep -v ^$
Con la ayuda de la respuesta aceptada aquí y la respuesta aceptada anterior, he usado:
Esto cubre todas las bases y funciona perfectamente para mis necesidades. Felicitaciones a los carteles originales @Kent y @kev
fuente
Puedes decir:
fuente
print all lines except the empty one(s)
y cállateTambién puedes hacer algo así usando "grep":
fuente
Esto funciona en awk también.
fuente
Lo más probable es que vea el 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 a un archivo de texto de estilo UNIX antes de ejecutar sed o usarpara eliminar líneas en blanco, ya sea que haya o no retorno de carro.
fuente
-r
haciendo la bandera y es posible combinarla-i
para modificar el archivo directamente y evitar imprimir en la pantalla? Además, creo que este comando también funcionaría comosed -r "/^\r$/d"
Otra opción sin
sed
,awk
,perl
, etc.cadenas: imprime las cadenas de caracteres imprimibles en archivos.
fuente
strings
lugar destring
?Mi
bash
respuesta específica es recomendar el uso delperl
operador de sustitución con elg
indicador de patrón global para esto, de la siguiente manera:Esta respuesta ilustra la contabilidad de si las líneas vacías tienen o no espacios en ellas (
[\ ]*
), así como el uso|
para separar múltiples términos / campos de búsqueda. Probado en macOS High Sierra y CentOS 6/7.Para su información, el código original del OP
sed '/^$/d' $file
funciona bien enbash
Terminal en macOS High Sierra y CentOS 6/7 Linux en un clúster de supercomputación de alto rendimiento.fuente
Para mí con FreeBSD 10.1 con sed funcionó solo esta solución:
dentro
[]
hay símbolos de espacio y tabulación.el archivo de prueba contiene:
fuente