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.