Come funziona questo comando sed?


12

Ho trovato questa soluzione per stampare una riga specifica da un file di testo:

sed '123!d;q' file

Perché in questo caso non si chiude dopo la prima riga di input?

Risposte:


20

In inglese, questo sedprogramma significa: per ogni riga,

  • [ 123!] se il numero di riga corrente non è 123, quindi [ d] elimina la riga corrente e avvia il ciclo successivo (ovvero passa alla riga successiva);
  • quindi (ma raggiungiamo questo punto solo se il dcomando non è stato eseguito), [ q] esce senza elaborare altre righe (ma stampa la riga corrente nelle nostre piaghe morenti).

O se preferisci, nella sintassi della shell:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done

Grazie, anche questo mi ha chiarito. Il mio errore era che ho capito che !era collegato d, non 123.
— rozcietrzewiacz,

@Gilles: mancano le parentesi graffe {d;q;}, non dovrebbe qapplicarsi a ogni riga (quindi solo la prima)?
— enzotib,

1
@enzotib si qapplica a ogni riga in cui viene eseguita. Ma quando il numero di riga non è 123, il dcomando viene eseguito e il suo significato è quello di saltare immediatamente alla riga di input successiva.
— Gilles 'SO- smetti di essere malvagio' il

Spiegazione cristallina
— Rahul Patil,

Sostanzialmente fa lo stesso di sed -n 123p(stampa lo stesso output) tranne che si ferma dopo la riga 123 anziché elaborare potenzialmente altre migliaia di righe con le quali non farà mai nulla.
— Wildcard il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.