Cosa fa l'opzione `-n` in sed?


13

Questa è la voce della pagina man per -n:

-n

sopprime la stampa automatica dello spazio del motivo

Noto che quando non si utilizza -nper determinate operazioni, ogni riga viene stampata su stdout (e le righe richieste vengono stampate due volte):

$ 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

Tuttavia, questa legge non vale per altri comandi:

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

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

Quindi cosa fa -nesattamente?

Risposte:


17

Normalmente sed elabora ciascuna riga (sostituendo ecc.), Quindi stampa il risultato. Se l'elaborazione comporta la stampa della linea (ad es. pComando di sed ), viene stampata due volte (una volta durante l'elaborazione, quindi di nuovo mediante la stampa post-elaborazione automatica). L' -nopzione disabilita la stampa automatica, il che significa che le linee che non gli dici specificamente di stampare non vengono stampate, e le linee che dici esplicitamente di stampare (ad es. Con p) vengono stampate una sola volta.

  • sed -n '2,3p' test.txt - stampa solo le linee da 2 a 3, come richiesto

  • sed '2,3p' test.txt - stampa ogni riga (automaticamente), E ANCHE stampa le righe 2-3 una seconda volta

  • sed -n 's/t/T/' test.txt - sostituisce "t" con "T" su ogni riga, ma non stampa il risultato a causa di -n

  • sed 's/t/T/' test.txt - sostituisce "t" con "T" su ogni riga e stampa automaticamente il risultato

E vorrei aggiungere altri esempi:

  • sed -n 's/t/T/p' test.txt - sostituisce "t" con "T" su ogni riga, stampa SOLO le righe in cui è avvenuta la sostituzione (ovvero non "secondo")

  • sed 's/t/T/p' test.txt - sostituisce "t" con "T" su ciascuna riga, stampa le linee in cui è avvenuta la sostituzione, quindi stampa automaticamente ogni riga (risultato: "secondo" viene stampato una volta, tutte le altre due volte)

  • sed '2,3p; 3p' test.txt- stampa le righe 1, 4 e 5 una volta (la stampa automatica); riga 2 due volte (il primo pcomando quindi la stampa automatica) e riga 3 tre volte (una volta per ciascun pcomando, poi di nuovo automaticamente).


Grazie Gordon, ma la tua valutazione ripete solo la mia osservazione. Nei primi due esempi sed senza -nstampare tutte le righe oltre a quelle specificatamente richieste. Pertanto, in tal caso, -n elimina la stampa di ogni riga analizzata . Tuttavia nel terzo e quarto esempio il comportamento è diverso. In quei casi sed senza -nnon genera le linee due volte, quindi l'utilizzo -nnon sopprime la stampa di ogni riga analizzata ma piuttosto sopprime la stampa delle linee non modificate . Ho difficoltà a generalizzare quando il comportamento sarà l'uno o l'altro.
dotancohen,

No, in entrambi i casi -nsta facendo esattamente la stessa cosa: il passaggio da ogni riga che viene stampata automaticamente (e il modificatore pe pa un comando sostitutivo fa sì che la riga venga stampata più volte) a una modalità in cui le righe vengono stampate solo se specificatamente a (con il pcomando ecc.).
Gordon Davisson,

Per dirla in un altro modo: prova ad aggiungere l' -nopzione E ANCHE aggiungendo ; pal comando sed (ad esempio sed -n '2,3p; p', e otterrai gli stessi risultati che avresti senza di loro. -nSopprime la stampa automatica predefinita e ; paggiunge un esplicito (per lo più equivalente )
Gordon Davisson,

Vedo ora, grazie. Apprezzo molto il tuo tempo dedicato a rendere esplicito l'esempio. Buona settimana!
dotancohen,
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.