Come rimuovere le righe vuote da un file (inclusi tab e spazi)?


Risposte:


26

Solo grepper i non-spazi:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], all'interno degli intervalli di caratteri ( [...]), viene chiamata classe di caratteri POSIX. Ci sono alcuni tipi [:alpha:], [:digit:]... [:blank:]corrisponde a uno spazio bianco orizzontale (nella locale POSIX, che è spazio e scheda, ma in altre versioni locali potrebbero essercene altri, come tutti i caratteri di spaziatura orizzontale Unicode in locali UTF8) mentre [[:space:]]corrisponde a bianco orizzontale e verticale caratteri di spazio (uguale a [:blank:]più cose come la scheda verticale, il feed del modulo ...).

grep '[:blank:]'

Restituirebbe le righe che contengono uno qualsiasi dei personaggi, :, b, l, a, no k. Le classi di caratteri sono riconosciute solo all'interno [...]e ^all'interno [...]del set nega. Quindi [^[:blank:]]significa qualsiasi personaggio tranne quelli vuoti.


1
dovrebbe esserci anche un $fine linea?
Michael Durrant,

@MichaelDurrant Non è ancorato su entrambi i lati
jordanm

1
@MichaelDurrant. [^[:blank:]]$corrisponderebbe solo alle righe che terminano in un non vuoto. Vogliamo linee che contengano un non-vuoto ovunque
Stéphane Chazelas,

@StephaneChazelas Ho provato grep [: blank:] SOURCEFILE anche questo comando funziona. Capisco [] è per la classe di personaggi, per favore, puoi darmi qualche idea su come funziona? lo snippet: vuoto: è nuovo per me.
Jamshed Ansari user3000272

Ci sono casi in cui grep -E '\S'non funzionerebbe?
terdon

21

Ecco una awksoluzione:

$ awk NF file

Con awk, NFimpostato solo su linee non vuote. Quando questa condizione corrisponde, l' awkazione predefinita che printverrà stampata l'intera riga.


Pulito, questo rimuove anche le linee con spazi bianchi.
Wisbucky,

7

Che ne dite di:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

o

sed -e '/^[[:blank:]]*$/d' source_file > newfile

vale a dire

Per ogni riga, sostituire:

  • se inizia (" ^")
  • con spazi o tabulazioni (" [[:blank:]]") zero o più volte (" *")
  • e quindi è la fine della riga (" $")

Maggiori informazioni su :: blank :: e altri caratteri speciali su http://www.zytrax.com/tech/web/regex.htm#special


4
[[:space:]]include schede. Altrimenti la tua regex fallirebbe se uno spazio seguisse una scheda.
Giordania,

Le pagine man wctype(3)e isalpha(3)descrivono ciò che corrisponderà alle classi di personaggi.
Giordania,

Potresti voler rimuovere il primo che non risponde alla domanda.
Stéphane Chazelas,

@MichaelDurrant puoi per favore scrivere qualcosa su [[: blank:]]?
Jamshed Ansari user3000272

Informazioni aggiunte per [[: blank ::]]. Stephane, perché il primo non funziona? Ho pensato che // alla fine avrebbe sostituito la linea senza nulla.
Michael Durrant,

4

È possibile utilizzare il sedcomando per rimuovere le righe vuote:

sed '/^$/d' in > out

Questo comando cancella tutte le righe vuote dal file "in"


Ciò non elimina le righe contenenti solo spazio e tab, come richiesto in modo specifico.
dave_thompson_085,

3

Sembra di averne trovato uno non così veloce, ma finalmente divertente:

| xargs -L1


1
Bello, ma fa di più: rimuovi anche gli spazi e le schede iniziali.
jringoot,

Oh, si è scoperto che è ancora più capace? - Bello! ;-P
poige il

1
E tronca le linee (impostazione predefinita a 1024 caratteri) Vedi manpage: linux.die.net/man/1/xargs
jringoot,

Mi sto innamorando di più di quel semplice strumento !!! 11)
poige


0

Utilizzare il comando seguente:

grep '\S' FILE

che rimuove tutte le linee inclusi spazi o tabulazioni.

Altrimenti, la rimozione, escluse le linee con spazi / tabulazioni, usa:

grep . FILE

Per esempio:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Guarda anche:

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.