Come rimuovere le righe vuote / vuote da un file in Unix (spazi inclusi)?


61

Come rimuovo le righe vuote / vuote (inclusi solo gli spazi) in un file in Unix / Linux usando la riga di comando?

contenuto di file.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

output desiderato

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
Questa è una risposta epica che dà praticamente ogni possibile soluzione utilizzando grep, sed, awk: stackoverflow.com/questions/16414410/...
wisbucky

Risposte:


87

Questa linea sed dovrebbe fare il trucco:

sed -i '/^$/d' file.txt

Ciò -isignifica che modificherà il file sul posto.


13
In realtà deve essere "/ ^ * $ / d" per rimuovere le righe che contengono solo spazi.
Sean Reifschneider,

2
@SeanReifschneider Quel requisito non era nella domanda quando questa risposta è stata scritta?
Kasperd,

4
@SeanReifschneider "/ ^ \ s * $ / d" non sarebbe migliore in quanto includerebbe le schede? Anche se non è menzionato nel post originale, mi sembra un'opzione più forte.
mrswadge,


Ricevobad flag in substitute command: 'e'
ishandutta2007 il

31

grep

La soluzione semplice consiste nell'utilizzare il comando grep( GNU o BSD ) come di seguito.

  • Rimuovi le righe vuote (escluse le righe con spazi).

    grep . file.txt
    
  • Rimuovere le linee completamente vuote (comprese le linee con spazi).

    grep "\S" file.txt
    

Nota: se si ottengono colori indesiderati, significa che si greptratta di alias grep --color=auto(controllare per type grep). In tal caso, è possibile aggiungere un --color=noneparametro o semplicemente eseguire il comando as \grep(che ignora l'alias).


ripgrep

Simile con ripgrep(adatto per file molto più grandi).

Rimuovi le righe vuote senza includere le righe con spazi:

rg -N . file.txt

o comprese le linee con spazi:

rg -N "\S" file.txt

Guarda anche:


2
grep .sembra essere la soluzione più semplice.
Leone

L'aspetto negativo di grep .rispetto alle altre soluzioni è che metterà in evidenza tutto il testo in rosso. Le altre soluzioni possono preservare i colori originali. Confronta unbuffer apt search foo | grep .conunbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky Vedi i colori, perché grepè alias grep --color=autonel tuo sistema (controlla vicino :) type grep. Puoi eseguirlo come \grepo utilizzare il --color=noneparametro.
Kenorb,

@kenorb Se si utilizza grep --color=none ., si otterrà tutto il testo bianco, che sostituisce la formattazione del colore del comando originale (ad esempio: apt search foo)
wisbucky

grep .abbinerà le righe che contengono solo spazi, che l'OP dice non è desiderato.
Jim L.

27
sed '/^$/d' file.txt

d è il comando sed per eliminare una riga. ^$è un'espressione regolare che corrisponde solo a una riga vuota, un inizio di riga seguito da una fine di riga.


+1 per la spiegazione
Alex Raj Kaliamoorthy,

Questo comando non produce lo stesso output di OP richiesto (produce 5 righe, non 4).
Kenorb, il

22

Puoi usare l'opzione -v con grep per rimuovere le righe vuote corrispondenti.

Come questo

grep -Ev "^$" file.txt

4
Non credo che tu abbia bisogno del -E, almeno non con GNU grep, ma a parte questo sono così felice di vederlo fatto con grep! È ciò che cerco di preferire sed, ogni volta; i filtri in linea mi sembrano migliori degli editor in linea.
MadHatter,

Se vuoi saltare le righe commentate e vuote, specialmente quando hai a che fare con i file conf, usagrep -Ev '^#|^$' file.txt
Govind Kailas

7

Ecco una awksoluzione:

awk NF file.txt

Con Awk, NFimpostare solo su linee non vuote. Quando questa condizione corrisponde, l'azione predefinita di Awk è di stampare l'intera riga.


6

Per rimuovere le righe vuote, è possibile stringere ripetizioni di nuove righe con tr:

cat file.txt | tr -s '\n' '\n'

Questo produce 6 linee, non 4 come richiesto dall'OP.
Kenorb, il

1

xargs se non ti dispiace togliere lo spazio bianco principale

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

Ex / Vim

Ecco il metodo usando l' exeditor (parte di Vim):

ex -s +'v/\S/d' -cwq test.txt

Per più file (modifica sul posto):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Nota: il :bufdocomando non è POSIX .

Senza modificare il file (basta stampare sull'output standard):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

Per me il comando @ martigin-heemels stava lanciando un errore che lo risolveva (cioè un parametro fittizio su i),

sed -i '' '/^$/d' file.txt


0

Probabilmente il modo più semplice per rimuovere le righe vuote (senza spazi) è usare cat -s:

$ cat -s file
$ some-command | cat -s

Almeno se non si desidera modificare un file sul posto ma, ad esempio, scrivere sul terminale. Inoltre, non coinvolge alcuna attività di regex divertente, quindi è super facile da ricordare anche per le persone non amichevoli con la RE.


Da man cat:

-s, --squeeze-blank never more than one single blank line

Potrebbe essere diverso su diversi sistemi operativi, ma era presente su alcuni Linux e OpenBSD l'ultima volta che ho controllato.

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.