Ho provato grep -v '^$'
su Linux e non ha funzionato. Questo file proviene da un file system di Windows.
Ho provato grep -v '^$'
su Linux e non ha funzionato. Questo file proviene da un file system di Windows.
Risposte:
Prova quanto segue:
grep -v -e '^$' foo.txt
L' -e
opzione consente schemi regex per la corrispondenza.
Le virgolette singole in giro lo ^$
fanno funzionare per Cshell. Altre shell saranno felici con virgolette singole o doppie.
AGGIORNAMENTO: Questo funziona per me per un file con righe vuote o "tutto lo spazio bianco" (come le righe di Windows con terminazioni di riga di stile "\ r \ n"), mentre quanto sopra rimuove solo i file con righe vuote e terminazioni di riga di stile unix:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, tutto ciò che -e
viene interpretato come modello.
grep -v -e '^[[:space:]]*$' -e '^#' file
fornirà tutte le righe non vuote e non di commento in uno script o in un file di configurazione (o qualsiasi tipo di file che utilizza il carattere hash per i commenti).
-e
opzione consente schemi regex per la corrispondenza." Questo è molto fuorviante . -e
è una definizione (POSIX-) per: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
(dal manuale ). Grep prevede già un'espressione regolare (di base) per impostazione predefinita. Per questo motivo, si può lasciare fuori -e
tutto: grep -v '^[[:space:]]*$' foo.txt
.
Mantienilo semplice.
grep . filename.txt
Uso:
$ dos2unix file
$ grep -v "^$" file
O semplicemente awk:
awk 'NF' file
Se non hai dos2unix, puoi usare strumenti come tr :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
grep -v "^[[:space:]]*$"
The -v makes it print lines that do not completely match
===Each part explained===
^ match start of line
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc.
* previous match (whitespace) may exist from 0 to infinite times
$ match end of line
Esecuzione del codice
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
Per capire di più su come / perché funziona, consiglio di leggere le espressioni regolari. http://www.regular-expressions.info/tutorial.html
Preferisco usare egrep
, anche se nel mio test con un file originale con una riga vuota il tuo approccio ha funzionato bene (anche se senza virgolette nel mio test). Anche questo ha funzionato:
egrep -v "^(\r?\n)?$" filename.txt
Se hai sequenze di più righe vuote in una riga e desideri una sola riga vuota per sequenza, prova
grep -v "unwantedThing" foo.txt | cat -s
cat -s
elimina le righe di output vuote ripetute.
Il tuo output verrebbe da
match1
match2
per
match1
match2
Le tre righe vuote nell'output originale verrebbero compresse o "compresse" in una riga vuota.
Lo stesso delle risposte precedenti:
grep -v -e '^$' foo.txt
Qui, grep -e
significa la versione estesa di grep . '^ $' significa che non ci sono caratteri tra ^ (inizio riga) e $ (fine riga). '^' e '$' sono caratteri regex.
Quindi il comando grep -v
stamperà tutte le righe che non corrispondono a questo modello (nessun carattere tra ^ e $).
In questo modo, vengono eliminate le righe vuote vuote.
-e
non significa "la versione estesa di grep", forse sei confuso con -E
? Il manuale dice chiaramente che -e
dice esplicitamente che segue un modello. Poiché il pattern non inizia con un trattino e si sta definendo comunque solo un pattern, è possibile lasciarlo fuori come per impostazione predefinita grep prevede un pattern regex: grep -v '^$' foo.txt
(non è necessaria la funzionalità regex estesa). Inoltre, vale la pena ricordare che ciò non elimina le righe vuote nel file, ma solo ciò che viene inviato attraverso l'output. In tal caso, sed -i
sarebbe lo strumento giusto.
Ho provato duramente, ma questo sembra funzionare (supponendo che \r
ti morda qui):
printf "\r" | egrep -xv "[[:space:]]*"
Utilizzando Perl:
perl -ne 'print if /\S/'
\S
significa abbinare caratteri non vuoti.
egrep -v "^ \ s \ s +"
egrep fa già regex e il \ s è uno spazio bianco.
Il + duplica il modello corrente.
Il ^ è per l'inizio
Uso:
grep pattern filename.txt | uniq
uniq
ridurrà le righe vuote adiacenti a una sola riga vuota, ma non le rimuoverà completamente. Tuttavia, mi piace provare a usarlo in uniq
quel modo. L'ordinamento per primo rimuove effettivamente tutte le righe vuote, lasciandone solo una, ma risistemare l'ordine delle righe potrebbe non essere accettabile.
Ecco un altro modo per rimuovere le linee bianche e le linee che iniziano con il #
segno. Penso che questo sia abbastanza utile per leggere i file di configurazione.
[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults requiretty
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
stack ALL=(ALL) NOPASSWD: ALL
È vero che l'uso di grep -v -e '^ $' può funzionare, tuttavia non rimuove le righe vuote che contengono 1 o più spazi . Ho trovato la risposta più semplice e più semplice per rimuovere le righe vuote è l'uso di awk . Quello che segue è un po 'modificato dai ragazzi awk sopra:
awk 'NF' foo.txt
Ma poiché questa domanda è per usare grep, risponderò a quanto segue:
grep -v '^ *$' foo.txt
Nota : lo spazio vuoto tra ^ e *.
Oppure puoi usare \ s per rappresentare uno spazio vuoto come questo:
grep -v '^\s*$' foo.txt