Sto cercando di eliminare le righe vuote utilizzando sed:
sed '/^$/d'
ma non ho fortuna.
Ad esempio, ho queste righe:
xxxxxx
yyyyyy
zzzzzz
e voglio che sia come:
xxxxxx
yyyyyy
zzzzzz
Quale dovrebbe essere il codice per questo?
Sto cercando di eliminare le righe vuote utilizzando sed:
sed '/^$/d'
ma non ho fortuna.
Ad esempio, ho queste righe:
xxxxxx
yyyyyy
zzzzzz
e voglio che sia come:
xxxxxx
yyyyyy
zzzzzz
Quale dovrebbe essere il codice per questo?
Risposte:
Potresti avere spazi o tab nella riga "vuota". Utilizzare le classi POSIX con sed
per rimuovere tutte le righe contenenti solo spazi bianchi:
sed '/^[[:space:]]*$/d'
Una versione più breve che utilizza ERE, ad esempio con gnu sed:
sed -r '/^\s*$/d'
(Notare che sed NON supporta PCRE.)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
corrisponderà a tutte le righe "vuote", vuol dire che qui la riga non contiene caratteri o la riga contiene solo stringhe vuote (ad es. Spazi). Tutte le linee abbinate verranno rimosse da sed, con il d
comando.
Mi manca la awk
soluzione:
awk 'NF' file
Che ritornerebbe:
xxxxxx
yyyyyy
zzzzzz
Come funziona? Dato che NF
sta per "numero di campi", quelle righe vuote hanno 0 fiedls, quindi awk valuta 0 come False e nessuna linea viene stampata; tuttavia, se esiste almeno un campo, la valutazione è True e fa awk
eseguire la sua azione predefinita: stampare la riga corrente.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
sapresti un modo ingegnoso di includerlo in uno script awk come, ad esempio, un modello? awk '/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'
.
sed '/^$/d'
dovrebbe andare bene, ti aspetti di modificare il file in atto? In tal caso, dovresti usare la -i
bandiera.
Forse quelle linee non sono vuote, quindi in questo caso, guarda questa domanda Rimuovi le righe vuote dai file txt, rimuovi gli spazi dall'inizio e dalla fine della linea Credo che sia quello che stai cercando di ottenere.
sed -i '/^$/d'
è un modo per farlo.
[]
devono essere esclusi in un'espressione di parentesi, quindi il codice qui non è corretto per \[\[:space:\]\]
o \[ \t\]
- dovrebbe essere [[:space:]]
e [ \t]
.
Credo che questo sia il più semplice e veloce:
cat file.txt | grep .
Se è necessario ignorare anche tutte le righe degli spazi bianchi, provare questo:
cat file.txt | grep '\S'
Esempio:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
uscite
7
5
cat
grep
grep . file.txt
grep '\S'
non è sicuramente portatile. In tal caso, grep -P
è possibile utilizzare grep -P '\S'
ma non è supportato su tutte le piattaforme.
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 ^$
Con l'aiuto della risposta accettata qui e della risposta accettata sopra, ho usato:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
Questo copre tutte le basi e funziona perfettamente per le mie esigenze. Complimenti per i poster originali @Kent e @kev
Funziona anche in awk.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
Molto probabilmente stai vedendo il comportamento imprevisto perché il tuo file di testo è stato creato su Windows, quindi la sequenza di fine riga è \r\n
. È possibile utilizzare dos2unix per convertirlo in un file di testo in stile UNIX prima di eseguire sed o utilizzare
sed -r "/^\r?$/d"
per rimuovere le righe vuote indipendentemente dalla presenza del ritorno a capo.
-r
facendo la bandiera ed è possibile combinarlo con -i
per modificare direttamente il file ed evitare di stampare sullo schermo. Inoltre, penso che questo comando funzionerebbe anche comesed -r "/^\r$/d"
Un'altra opzione, senza sed
, awk
, perl
, ecc
strings $file > $output
stringhe: stampa le stringhe di caratteri stampabili nei file.
strings
invece string
?
La mia bash
risposta specifica è raccomandare di utilizzare l' perl
operatore di sostituzione con il g
flag di modello globale per questo, come segue:
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
Questa risposta illustra la contabilità se le righe vuote contengono o meno spazi ( [\ ]*
), oltre a utilizzare |
per separare più termini / campi di ricerca. Testato su macOS High Sierra e CentOS 6/7.
Cordiali saluti, il codice originale dell'OP sed '/^$/d' $file
funziona perfettamente in bash
Terminal su macOS High Sierra e CentOS 6/7 Linux in un cluster supercomputer ad alte prestazioni.
Per me con FreeBSD 10.1 con sed funzionato solo questa soluzione:
sed -e '/^[ ]*$/d' "testfile"
all'interno []
ci sono simboli di spazio e tabulazione.
il file di test contiene:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============