Ovo mozes uraditi na vise nacina (uz redirekciju stdout-a, naravno), koristeci direktnu i inverznu logiku kod regularnog izraza za prazan red, a sto se tice filtera, to je stvar ukusa 
[1] prikazi svaki red koji sadrzi bar jedan karakter
$ sed -n '/./p' test.txt > test1.txt
$ mv test1.txt test.txt
ili
$ grep '.' test.txt > test1.txt
$ mv test1.txt test.txt
ili
$ awk '/./ { print }' test.txt > test1.txt
$ mv test1.txt test.txt
[2] prikazi sve redove, osim onih koji ne sadrze ni jedan karakter
$ sed '/^$/d' test.txt > test1.txt
$ mv test1.txt test.txt
ili
$ grep -v '^$' test.txt > test1.txt
$ mv test1.txt test.txt
ili
$ awk '!/^$/ { print }' test.txt > test1.txt
$ mv test1.txt test.txt
Idealno rjesenje za pisanje nazad u isti fajl ne postoji, jer velicina fajla nakon editovanja nije unaprijed poznata, a cak i da jeste, takvo rjesenje bi uzasno uticalo na performanse, jer bi pola vremena bilo potrebno za premijestanja sadrzaja i slicne operacije, koje se opet ne uklapaju u filozofiju UNIX-a. Mnogo je jednostavnije napraviti novi fajl i u njega upisivati sadrzaj i to je jedino rjesenje koje se koristi.
Sto se tice awk-a, on je super za odredjene stvari, ali, koliko je meni poznato, nema opciju za in-place file editing. Zato ima perl:
[3] _prikazi_ svaki red koji sadrzi bar jedan karakter
i snimi rezultat u fajl test.txt umjesto prikazivanja na terminalu
$ perl -n -i -e 'print if /./' test.txt
[4] _prikazi_ sve redove, osim onih koji ne sadrze ni jedan karakter
i snimi rezultat u fajl test.txt umjesto prikazivanja na terminalu
$ perl -n -i -e 'print unless /^$/' test.txt
Perl koristi opciju -i za in-place editing, tako da sve prikazane linije bivaju snimljene u fajl test.txt, pri cemu se prethodni sadrzaj fajla test.txt gubi (postoji mogucnost da se napravi backup starog fajla, ako se na opciju -i doda sufiks, ali to vidi u man perlrun).
Iako je ovo rjesenje elegantnije sa aspekta kucanja, u sustini se i ono svodi na pravljenje novog fajla:
$ strace perl -n -i -e 'print if /./' test.txt 2>&1 | egrep '(unlink|open)("test.txt'
open("test.txt", O_RDONLY|O_LARGEFILE) = 3
unlink("test.txt") = 0
open("test.txt", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4
Ovo je pravo dobar fol
– perl otvori fajl test.txt za citanje (O_RDONLY) i dobije deskriptor 3. Posto ima ovaj deskriptor, ime fajla mu vise nije potrebno, pa ga bachi sa unlink. Onda opet poziva open da napravi novi fajl (O_CREAT) opet sa imenom test.txt, koje je upravo oslobodio. Ovdje se radi o drugom fajlu, koji je otvoren za pisanje (O_WRONLY). Sada je sve ostalo obicno prepisivanje iza kulisa:
1. citaj red sa deskriptora 3
2. ako ima barem jedan karakter u tom redu, pisi taj red na deskriptor 4
3. ako ima jos za citanje goto 1 :)
Zamisli da imas ovu situaciju:
$ cat test.txt
prvi red
treci red
$ ( sleep 60 ; cat ) < test.txt &
$ perl -n -i -e 'print if /./' test.txt
$ cat test.txt
prvi red
treci red
$
PITANJE: Sta ce se desiti kada prodje 60 sekundi spavanja?
–
PS: Sve ove stvari sa regularnim izrazima i filtriranjem mozes rijesiti uz malo interaktivnosti i sa vi editorom. U slucaju brisanja praznih redova iz fajla, to je:
$ vi test.txt
# Kad se otvori vi, kucas:
:g/^$/d
:wq
To je to.