¿Cómo eliminar líneas más cortas que XY?

Encontré una pregunta sobre cómo eliminar líneas más largas que 2048 caracteres:

¿Cómo borrar la línea si es más larga que XY?

P: ¿Pero cómo puedo eliminar líneas más cortas que 4 caracteres? Por lo tanto, elimine las líneas que tengan 1 o 2 o 3 largos en un file.

ACTUALIZACIÓN: Gracias por las muchas BUENAS respuestas, pero solo puedo marcar una como OK

Podría usar sed . Lo siguiente eliminaría las líneas que tienen 3 caracteres de longitud o less:

 sed -r '/^.{,3}$/d' filename 

Para save los cambios en el file in situ, proporcione la opción -i .

Si su versión de sed no es compatible con la syntax RE extendida, entonces podría escribir lo mismo en BRE:

 sed '/^.\{,3\}$/d' filename 

que funcionaría con todas las variantes sed .


También puedes usar awk :

 awk 'length($0)>3' filename 

Usando perl :

 perl -lne 'length()>3 && print' filename 

Algunas más variaciones:

 grep .... file 

o

 sed '/..../!d' file 

o

 sed -n 's/./&/4p' file 

o

 awk 'gsub(/./,"&")>3' file 

o

 awk 'length>3' file 

o GNU awk:

 awk 'NF>3' FS= file 

para eliminar directamente las líneas que podrías:

 sed -ri '/.{4}/!d' /path/to/file 

O BRE:

 sed -i '/.\{4\}/!d' /path/to/file 

Si una línea no contiene 4 o más caracteres, se elimina.

 f=/path/to/file cat <<GREP >"$f" $(grep -E ".{4}" "$f") GREP 

Hacer lo anterior en subshell de sustitución de command asegurará que grep obtenga un descriptor de lectura antes de que cat empiece a escribir en él, pero el <<HEREDOC también garantizará que el resultado permanezca transmitido y no cause errores de longitud de argumento.

Aquí está la solución de Vim que usa el modo Ex de Vim y el command global .

Esto es muy similar al uso de sed , solo que algunos caracteres especiales ('{', '}') necesitan ser escapados.

 :g/^.\{,3\}$/d 

Usando el modo Regeneración mágica de Vim (\ v), se puede evitar este escape.

 :g/\v^.{,3}$/d 

Ver también: ayuda mágica

 Use of "\v" means that in the pattern after it all ASCII characters except '0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning. "very magic" 

También a veces es útil hacer lo contrario con vglobal .

 :v/\v^.{,3}$/d 

eliminaría todo less líneas hasta 3 caracteres.

 sed '/^.\?.\?.\?$/d' input.txt > output.txt 

Puedes usar grep :

Si count espacios principales en longitud de línea:

 grep -e '[^\ ]\{4,\}' file 

Si no count espacios principales en la línea leangth:

 grep -e '[^\]\{4,\}' file