Que fait l'option `-n` dans sed?

13

Il s'agit de la page de manuel pour -n:

-n

supprimer l'impression automatique de l'espace du motif

Je remarque que lorsque vous ne l' utilisez pas-n pour certaines opérations, chaque ligne est imprimée sur stdout (et les lignes demandées sont imprimées deux fois):

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

Cependant, cette loi ne s'applique pas aux autres commandes:

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

Alors qu'est-ce que ça -nfait exactement?

dotancohen
la source

Réponses:

17

Normalement, sed traite chaque ligne (faisant des substitutions, etc.), puis imprime le résultat. Si le traitement implique l'impression de la ligne (par exemple la pcommande sed ), elle est imprimée deux fois (une fois pendant le traitement, puis à nouveau par l'impression automatique de post-traitement). L' -noption désactive l'impression automatique, ce qui signifie que les lignes que vous ne lui demandez pas spécifiquement d'imprimer ne sont pas imprimées et que les lignes que vous lui demandez explicitement d'imprimer (par exemple avec p) ne sont imprimées qu'une seule fois.

  • sed -n '2,3p' test.txt - imprime uniquement les lignes 2 à 3, comme demandé

  • sed '2,3p' test.txt - imprime chaque ligne (automatiquement), et imprime également les lignes 2-3 une seconde fois

  • sed -n 's/t/T/' test.txt - remplace "t" par "T" sur chaque ligne, mais n'imprime pas le résultat en raison de -n

  • sed 's/t/T/' test.txt - remplace "t" par "T" sur chaque ligne et imprime automatiquement le résultat

Et permettez-moi d'ajouter quelques exemples:

  • sed -n 's/t/T/p' test.txt - remplace "t" par "T" sur chaque ligne, imprime UNIQUEMENT les lignes où la substitution a eu lieu (c'est-à-dire pas "deuxième")

  • sed 's/t/T/p' test.txt - remplace "t" par "T" sur chaque ligne, imprime les lignes où la substitution a eu lieu, puis imprime automatiquement chaque ligne (résultat: "seconde" est imprimé une fois, toutes les autres deux fois)

  • sed '2,3p; 3p' test.txt- imprime les lignes 1, 4 et 5 une fois (l'impression automatique); ligne 2 deux fois (la première pcommande puis l'impression automatique), et ligne 3 trois fois (une fois pour chaque pcommande, puis à nouveau automatiquement).

Gordon Davisson
la source
Merci Gordon, mais votre évaluation ne fait que répéter mon observation. Dans les deux premiers exemples sed sans -nimprime chaque ligne en plus des lignes spécifiquement demandées. Ainsi, dans ce cas, -n supprime l'impression de chaque ligne analysée . Cependant, dans les troisième et quatrième exemples, le comportement est différent. Dans ces cas, sed sans -nne produit pas les lignes deux fois, donc l'utilisation -nne supprime pas l'impression de chaque ligne analysée mais supprime plutôt l'impression des lignes non modifiées . J'ai du mal à généraliser quand le comportement sera l'un ou l'autre.
dotancohen
Non, dans les deux cas, -nc'est exactement la même chose: passer de chaque ligne imprimée automatiquement (et le modificateur pet pà une commande de remplacement entraîne l'impression supplémentaire de la ligne) dans un mode où les lignes sont imprimées uniquement si vous le dites spécifiquement à (avec la pcommande etc).
Gordon Davisson
Autrement dit, essayez d'ajouter l' -noption ET AUSSI en ajoutant ; pà la commande sed (par exemple sed -n '2,3p; p', et vous obtiendrez les mêmes résultats que vous auriez sans l'un ou l'autre. Le -nsupprime l'impression automatique par défaut et l' ; pajout d'une explicite (généralement équivalente) )
Gordon Davisson,
Je vois maintenant, merci. J'apprécie beaucoup que vous ayez pris le temps d'aider à rendre l'exemple explicite. Passez une excellente semaine!
dotancohen