Ho un documento con molte righe vuote.
Come posso rimuoverli quando ce ne sono 2 o più insieme.
Ho provato il sed "s/\n\n//"
file ma non ha funzionato. Nessun errore.
Ho un documento con molte righe vuote.
Come posso rimuoverli quando ce ne sono 2 o più insieme.
Ho provato il sed "s/\n\n//"
file ma non ha funzionato. Nessun errore.
Risposte:
Solo per rimuovere le righe vuote:
sed '/^$/d'
sed
è orientato alla linea, quindi pensare in termini di "2 o più di un particolare byte" funziona tranne quando quel byte è una nuova riga. Quindi devi pensare a qualcosa che funziona per l'intera linea.
sed
è in grado di gestire più linee tramite la sua funzione "spazio modello" / "spazio di attesa". Ma penso che sia troppo complicato. ;-)
1!
(abbinare tutti tranne la linea 1), in tal modo: sed '1!{/^$/d'}
.
sed
. La creazione di un file eliminerà essenzialmente qualsiasi file esistente con lo stesso nome. sed '/^&/d' file.txt > otherfile.txt
funzionerà.
Non c'è bisogno di sed
. grep
andrà bene:
grep .
(ovvero grep
SPC, punto, che corrisponde a qualsiasi riga contenente almeno un carattere).
C'è anche:
tr -s '\n'
(stringi qualsiasi sequenza di caratteri di nuova riga in uno).
Come notato da Chris, entrambi non sono equivalenti perché rimuovere le righe vuote (come la prima soluzione sopra e la maggior parte delle altre risposte si concentra su qui) non è lo stesso di spremere sequenze di caratteri di nuova riga come richiesto nel caso in cui la prima riga è vuota in quanto richiede solo un carattere di nuova riga iniziale per rendere vuota la prima riga.
Avendo visto la risposta di @Bruce Ediger sed
non è lo strumento migliore per questo, dal momento che è basato sulla linea e considera \n
il carattere di fine linea questo diventa complicato.sed
potrebbe essere lo strumento perfetto per il lavoro, tuttavia, ecco alcune altre opzioni:
Perl
perl -ne 'print if /./' file.txt
o
perl -pe '$/=""; s/\n+/\n/;' file.txt
Grazie a @ruakh che mi ha fatto andare a leggere questo :
$ /
Il separatore del record di input, newline per impostazione predefinita. Ciò influenza l'idea di Perl di cosa sia una "linea". Funziona come la variabile RS di awk, incluso il trattamento di righe vuote come terminatore se impostato sulla stringa null (una riga vuota non può contenere spazi o tabulazioni). È possibile impostarlo su una stringa a più caratteri per abbinare un terminatore a più caratteri o su undef per leggere fino alla fine del file. Impostandolo su "\ n \ n" significa qualcosa di leggermente diverso dall'impostazione su "", se il file contiene righe vuote consecutive. L'impostazione su "" considera due o più righe vuote consecutive come un'unica riga vuota. L'impostazione su "\ n \ n" presuppone ciecamente che il carattere di input successivo appartenga al paragrafo successivo, anche se si tratta di una nuova riga.
gawk / awk
awk '$1' file.txt
Funzionerà con l'esempio pubblicato ma, come sottolineato da @Stephane Chazelas , eliminerà anche le righe il cui primo campo "sembra" 0
. Questo è più robusto:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txt
lo farà, il separatore del record di input è irrilevante per questo uso.
perl -pe
oppure perl -ne
lavorare riga per riga. \n+
non corrisponderà mai perché viene applicato solo su una singola riga. Ecco perché è necessario o insieme $/
o utilizzare -0
ti Slurp il file intero: perl -0pe 's/\n+/\n/' file
.
Cosa intendi per rimuovere? rimuovere il duplicato (molte righe vuote in una) o rimuovere tutto?
Se vuoi rimuovere i duplicati, ecco il metodo che usa sed:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Simula il uniq
comando.
La scelta migliore sta usando awk
:
awk NF <filename>
sed
parte di questo funziona alla grande! Raccomando questo come la migliore risposta.
Per la maggior parte di queste risposte è innanzitutto necessario rimuovere gli spazi bianchi finali. La rimozione di nuove righe raddoppiate rimuove tutte le righe vuote. (Pensaci).
Interpretato letteralmente l'OP vuole "tutte le righe vuote rimosse da un file se ci sono righe vuote ripetute".
L'utente tipico desidera "rimuovere solo le righe vuote duplicate".
Per fare ciò, spoglia prima lo spazio bianco finale e pipe anche se cat -s
sed s/[[:space:]]*$// | cat -s
Eppure questo non rimuoverà una linea vuota iniziale o finale superflous.
Se si desidera mantenere un'unica riga vuota per una determinata sequenza di righe vuote è possibile:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s
) che in realtà realizza esattamente ciò che la domanda posta come la capisco. (Ed è meglio che cat -s
perché posso usarlo sed -i
.)
Prova a sed -e 's#\\n\\n#\\n#g' input.file > output.file
utilizzare /
sia il separatore di campo che parte del regex potrebbero essere il problema.
Usa questo comando:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'
. Il comando tr
tradurrà tutto \r
in \n
e quindi comprimerà tutto \n
in uno solo. Quindi, funziona, non sono sicuro di cosa fare con il fatto che questo si applica a Windows, non a UNIX.