Rimuovi le righe vuote in un file di testo tramite grep


Risposte:


132

grep . FILE


(E se si vuole veramente farlo in sed, allora: sed -e /^$/d FILE)

(E se si vuole veramente farlo in awk, allora: awk /./ FILE)


1
Dolce! TY anche per gli altri comandi, ma sembra che grep sia il mio nuovo migliore amico.
user191960

grep. FILE non funziona per me. Probabilmente è meglio restare con grep per cercare i contenuti dei file e sed per modificare i contenuti dei file.
Michael Dillon

7
sed -ne/./pfunziona anche ed awk /./è più breve (l'azione è {print}se non specificata). @ ghostdog74: grep '[^[:space:]]'allora.
effimero

5
Per coloro che non capiscono, .è un'espressione regolare che corrisponde a qualsiasi carattere tranne che per la nuova riga.
wisbucky

3
grep . FILEfunziona con l'esempio fornito, ma non necessariamente quando il file può contenere byte che non fanno parte del set di caratteri. Ad esempio, con GNU grep 2.20, printf "\x80\n" | grep .non restituisce nulla.
vinc17

37

Prova quanto segue:

grep -v -e '^$'

questo ha lo stesso effetto di grep. FILE in quello uno spazio come una riga vuota verrà afferrato.
ghostdog74

1
"grep" cerca qualsiasi riga che corrisponda al modello. "." corrisponde a qualsiasi carattere. "grep. FILE" corrisponde a qualsiasi riga con almeno 1 carattere. Mentre "grep -v" esclude le righe che corrispondono al modello. OP ha detto "rimuovi tutte le nuove righe vuote". Se vuoi escludere righe con solo spazi, "grep -v '^ $'". " " Corrisponderà a zero o più del modello precedente, in questo caso uno spazio. Anche se potresti preferire abbinare ed escludere anche altri caratteri di spazio (tab, form-feed, ecc.).
signor Ree

3
Questo metodo mi ha permesso di combinare più esclusioni più facilmente del semplice "grep. FILE". Ad esempio, stavo guardando un file conf e volevo escludere tutte le righe commentate e tutte le righe vuote. Quindi ho usato "grep -v -e '#' -e '^ $' squid.conf". Ha funzionato a meraviglia.
Ben K

2
questo è molto più veloce di 'grep. FILE'. Ciò è dovuto ai compiti più complessi di verifica della regex "." che escludere non appena ^ $ non corrisponde.
Édouard Lopez

2
grep -v -e '^$'funziona sempre, il che non è il caso di grep .. Ad esempio, con GNU grep 2.20, printf "\x80\n" | grep .non restituisce nulla, mentre printf "\x80\n" | grep -v '^$'restituisce la riga non vuota.
vinc17

11
with awk, just check for number of fields. no need regex

$ more file
hello

world

foo

bar

$ awk 'NF' file
hello
world
foo
bar

Non necessita di preventivi. Questo trucco si trova in awk1line.txt- poi di nuovo, quindi sono la maggior parte dei trucchi awk :)
effimero

2
è solo una mia buona pratica mettere virgolette, dato che lo stai eseguendo da shell .. per le istruzioni composite awk, devi ancora inserire virgolette. quindi perché non coltivare questa abitudine.
ghostdog74

spiegazione di come funziona: stackoverflow.com/questions/23544804/...
wisbucky

9

Ecco una soluzione che rimuove tutte le righe che sono vuote o contengono solo spazi:

grep -v '^[[:space:]]*$' foo.txt

2

Prova questo: sed -i '/^[ \t]*$/d' file-name

Eliminerà tutte le righe vuote con alcun no. di spazi bianchi (spazi o tabulazioni) cioè (0 o più) nel file.

Nota: c'è uno "spazio" seguito da "\ t" all'interno della parentesi quadra.

Il modificatore -iforza a riscrivere i contenuti aggiornati nel file. Senza questo flag puoi vedere le righe vuote cancellate sullo schermo ma il file effettivo non sarà influenzato.


1

grep '^..' my_file

esempio

THIS

IS

THE

FILE

EOF_MYFILE

fornisce come output solo le righe con almeno 2 caratteri.

THIS
IS
THE
FILE
EOF_MYFILE

Vedi anche i risultati con gli grep '^' my_fileoutput

THIS

IS

THE

FILE

EOF_MYFILE

e anche con le grep '^.' my_fileuscite

THIS
IS
THE
FILE
EOF_MYFILE

1

Se rimuovere le righe vuote significa righe che includono eventuali spazi, utilizzare:

grep '\S' FILE

Per esempio:

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

line2

line3

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

line3

line4

Guarda anche:


0

Prova ex -way:

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

Per più file (modifica sul posto):

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

Senza modificare il file (basta stampare sullo standard output):

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

0

Perl potrebbe essere eccessivo, ma funziona altrettanto bene.

Rimuove tutte le righe completamente vuote:

perl -ne 'print if /./' file

Rimuove tutte le righe che sono completamente vuote o contengono solo spazi bianchi:

perl -ne 'print if ! /^\s*$/' file

Variazione che modifica l'originale e crea un file .bak:

perl -i.bak -ne 'print if ! /^\s*$/' file

0

Se vuoi sapere qual è il totale delle righe di codice nel tuo progetto Xcode e non sei interessato a elencare il conteggio per ogni file swift, questo ti darà la risposta. Rimuove le righe senza codice e rimuove le righe che hanno il prefisso del commento//

Eseguilo al livello principale del tuo progetto Xcode.

find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l

Se hai blocchi di commenti nel tuo codice che iniziano con /*e finiscono con */come:

/*
 This is an comment block 
*/

quindi questi verranno inclusi nel conteggio. (Troppo difficile).


0

Risposta più semplice -----------------------------------------

[root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
[root@node1 ~]#
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.