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.