Come rimuovere le linee più corte di XY?


29

Ho trovato una domanda su come rimuovere le righe più lunghe dei 2048 caratteri:

Come eliminare la linea se più lunga di XY?

D: Ma come posso rimuovere le righe più brevi di 4 caratteri? Quindi rimuovi le righe che hanno 1 o 2 o 3 lunghezze in un file.

AGGIORNAMENTO: Grazie per le molte BUONE risposte, ma posso solo segnarne una come OK

Risposte:


42

Puoi usare sed. Quanto segue rimuove le righe che sono lunghe 3 caratteri o più piccole:

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

Per salvare le modifiche sul file sul posto, fornire l' -iopzione.

Se la tua versione di sednon supporta la sintassi RE estesa, puoi scrivere lo stesso in BRE:

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

che funzionerebbe con tutte le sedvarianti.


Puoi anche usare awk:

awk 'length($0)>3' filename

Utilizzando perl:

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

sed '/^.\{,3\}$/d'non funziona con BSD sed: sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). La versione sed -r è sintatticamente valida, ma non rimuove le righe.
Dereckson,

5

Alcune altre varianti:

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

1
Oh quel grep .... è così elegante!
Grofte

3

Ecco la soluzione Vim che utilizza la modalità Ex di Vim e il globalcomando.

Questo è molto simile all'utilizzo sed, solo che alcuni caratteri speciali ('{', '}') devono essere salvati.

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

Usando la modalità Very Magic Regex di Vim (\ v), questa fuga può essere evitata.

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

Vedi anche: aiuta la magia

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"

Anche a volte utile è fare il contrario con vglobal.

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

eliminerebbe tutto tranne le righe fino a 3 caratteri.


1

per rimuovere direttamente le linee potresti:

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

O BRE:

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

Se una riga non contiene 4 o più caratteri, viene eliminata.

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

Fare quanto sopra nella subshell di sostituzione dei comandi assicurerà che grepottenga un descrittore di lettura su di esso prima che cat inizi a scrivergli, ma <<HEREDOCassicurerà anche che il risultato rimanga trasmesso in streaming e non causi errori di lunghezza degli argomenti.



0

Puoi usare grep:

Se conti gli spazi iniziali nella lunghezza della linea:

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

Se non si contano gli spazi iniziali nella linea sottile:

grep -e '[^\]\{4,\}' file
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.