Comment fonctionne cette commande sed?

12

Je suis tombé sur cette solution pour imprimer une ligne spécifique à partir d'un fichier texte:

sed '123!d;q' file

Pourquoi sed ne quitte-t-il pas après la première ligne d'entrée dans ce cas?

Eugene Yarmash
la source

Réponses:

20

En anglais, ce sedprogramme signifie: pour chaque ligne,

  • [ 123!] si le numéro de ligne actuel n'est pas 123, alors [ d] supprimer la ligne actuelle et démarrer le cycle suivant (c'est-à-dire passer à la ligne suivante);
  • puis (mais nous n'atteignons ce point que si la dcommande n'a pas été exécutée), [ q] quitte sans traiter plus de lignes (mais imprime la ligne courante dans nos affres).

Ou si vous préférez, dans la syntaxe du 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
Gilles 'SO- arrête d'être méchant'
la source
Merci, ça m'a éclairé aussi. Mon erreur était que je comprenais !était connecté à d, non 123.
rozcietrzewiacz
@Gilles: il manque les accolades {d;q;}, ne devrait pas qs'appliquer à chaque ligne (donc seulement la première)?
enzotib
1
@enzotib qs'applique à chaque ligne où il est exécuté. Mais lorsque le numéro de ligne n'est pas 123, la dcommande est exécutée et sa signification est de passer immédiatement à la ligne d'entrée suivante.
Gilles 'SO- arrête d'être méchant'
Explication limpide
Rahul Patil
Essentiellement, il fait la même chose que sed -n 123p(imprime la même sortie), sauf qu'il s'arrête après la ligne 123 plutôt que de traiter potentiellement des milliers de lignes supplémentaires avec lesquelles il ne fera jamais rien de toute façon.
Wildcard