2011-11-22 16 views
5

Dalla documentazione sed:il comando 'd' nel programma di utilità sed

d  Delete the pattern space; immediately start next cycle. 

Che cosa significa per prossimo ciclo? La mia comprensione è che sed non applicherà i seguenti comandi che dopo il comando d e iniziare a leggere la riga successiva dal flusso di input ed elaborarlo. Ma sembra che questa non sia la verità. Vedere questo exampel:

[[email protected] ~]# cat -A test.txt 
aaaaaaaaaaaaaa$ 
$ 
bbbbbbbbbbbbb$ 
$ 
$ 
ccccccccc$ 
ddd$ 
$ 
eeeeeee$ 
[[email protected] ~]# cat test.txt | sed '/^$/d;p;p' 
aaaaaaaaaaaaaa 
aaaaaaaaaaaaaa 
aaaaaaaaaaaaaa 
bbbbbbbbbbbbb 
bbbbbbbbbbbbb 
bbbbbbbbbbbbb 
ccccccccc 
ccccccccc 
ccccccccc 
ddd 
ddd 
ddd 
eeeeeee 
eeeeeee 
eeeeeee 
[[email protected] ~]# 

Se avviare immediatamente successivo ciclo, il comando p non avrà alcun output.

Chiunque può aiutarmi a spiegarlo per favore? Grazie.

risposta

7

Significa che sed leggerà la riga successiva e inizierà l'elaborazione.

Lo script di test non fa ciò che si pensa. Corrisponde alle linee vuote e applica loro il comando delete. Non appaiono, quindi le istruzioni di stampa non vengono applicate alle righe vuote. I due comandi di stampa non sono collegati al pattern per il comando delete, quindi le righe non vuote vengono stampate tre volte. Se invece si prova

sed '/./d;p;p' test.txt # matches all non-empty lines 

non verrà stampato nulla oltre alle righe vuote, tre volte ciascuna.

+0

Ho capito. Grazie! –

+0

Prego! –

1

a) È possibile combinare più comandi per un pattern con graffe:

sed '/^$/{d;p;p}' test.txt 

aaaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccc 
ddd 
eeeeeee 

Il comando d viene applicato solo alle righe vuote qui: '/^$/d; p, p'. Altrimenti la linea viene stampata altre 2 volte. Per associare il comando 'p'al modello, devi costruire parentesi graffe. Quindi il comando p viene saltato, ma a causa del salto al prossimo ciclo, non perché non corrisponde.

b) Uso inutile di cat. (già mostrato)

+0

Fatto, commento rimosso. –

Problemi correlati