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?

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.