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

29

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

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

P: ¿Pero cómo puedo eliminar líneas más cortas que 4 caracteres? Entonces, elimine las líneas que tienen 1 o 2 o 3 de longitud en un archivo.

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

evachristina
fuente

Respuestas:

42

Podrías usar sed. Lo siguiente eliminaría líneas de 3 caracteres de longitud o menos:

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

Para guardar los cambios en el archivo en el lugar, proporcione la -iopción.

Si su versión de sedno admite la sintaxis extendida de RE, entonces podría escribir lo mismo en BRE:

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

que funcionaría con todas las sedvariantes.


También puedes usar awk:

awk 'length($0)>3' filename

Utilizando perl:

perl -lne 'length()>3 && print' filename
devnull
fuente
sed '/^.\{,3\}$/d'no funciona con BSD sed: sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). La versión sed -r es sintácticamente válida, pero no eliminará líneas.
Dereckson
5

Algunas variaciones más:

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
Escrutador
fuente
1
¡Oh, qué mierda ... es tan elegante!
Grofte
3

Aquí está la solución de Vim usando el modo Ex de Vim y el globalcomando.

Esto es muy similar al uso sed, solo que algunos caracteres especiales ('{', '}') deben escaparse.

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

Usando el modo Very Magic Regex 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 menos las líneas hasta 3 caracteres.

gergap
fuente
1

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 la subshell de sustitución de comandos asegurará que se grepobtenga un descriptor de lectura antes de que cat comience a escribir en él, pero <<HEREDOCtambién se asegurará de que el resultado permanezca transmitido y no cause errores de longitud de argumento.

mikeserv
fuente
0
sed '/^.\?.\?.\?$/d' input.txt > output.txt
Hauke ​​Laging
fuente
0

Puedes usar grep:

Si cuenta espacios iniciales en la longitud de la línea:

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

Si no cuenta los espacios iniciales en la longitud de línea:

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