Precedente: , Su: Esempi   [Contenuti][Indice]


4.17 Compattare le righe vuote

Come esempio finale, vengono descritti tre script, di complessità e velocità crescente, che implementano la stessa funzione di ‘cat -s’, cioè eliminare le righe vuote ripetute.

Il primo lascia una riga vuota all’inizio e una alla fine, se già sono presenti.

#!/usr/bin/sed -f

# sulle righe vuote, unisce con la successiva
# Si noti l'asterisco nella regexp
:x
/^\n*$/ {
N
bx
}
# ora comprime tutti i '\n', che può essere fatto anche con:
# s/^\(\n\)*/\1/
s/\n*/\
/

Questo è un po’ più complesso e rimuove tutte le righe vuote all’inizio. Lascia una sola riga vuota alla fine se è già presente.

#!/usr/bin/sed -f

# cancella tutte le righe vuote iniziali
1,/^./{
/./!d
}
# rimuove una riga vuota e tutte le righe vuote successive,
# tranne una
:x
/./!{
N
s/^\n$//
tx
}

Questo rimuove le righe vuote iniziali e finali. È anche il più veloce. Si noti che i cicli sono realizzati interamente con n e b, senza contare su sed per far ripartire lo script automaticamente alla fine di ogni riga.

#!/usr/bin/sed -nf

# cancellare tutte le righe (iniziali) vuote
/./!d
# arrivato fin qui: quindi esiste almeno una linea non vuota
:x
# stamparla
p
# prendere la successiva
n
# ci sono caratteri? Stamparli, etc... 
/./bx
# no, non ci sono caratteri: è una riga vuota
:z
# prendere la successiva, se è l'ultima terminare qui per non
# scrivere righe vuote finali
n
# vuota anche questa? Ignorare e andare alla prossima...
# così rimuovendo TUTTE le righe vuote
/./!bz
# a questo punto tutte le righe vuote sono state rimosse/ignorate.
# Poiché si vuole ridurre le righe bianche ripetute a una sola,
# si inserisce una riga vuota artificialmente
i\
bx

Precedente: , Su: Esempi   [Contenuti][Indice]