¿Qué hace la opción `-n` en sed?

13

Esta es la entrada de la página del manual para -n:

-norte

suprimir la impresión automática del espacio del patrón

Noto que cuando no se usa -npara ciertas operaciones, cada línea se imprime en stdout (y las líneas solicitadas se imprimen dos veces):

$ 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

Sin embargo, esta ley no es válida para otros comandos:

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

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

Entonces, ¿qué hace -nexactamente?

dotancohen
fuente

Respuestas:

17

Normalmente, sed procesa cada línea (haciendo sustituciones, etc.), luego imprime el resultado. Si el procesamiento involucra la línea que se está imprimiendo (por ejemplo, el pcomando de sed ), entonces se imprime dos veces (una durante el procesamiento y luego nuevamente mediante la impresión automática posterior al procesamiento). La -nopción deshabilita la impresión automática, lo que significa que las líneas que no le dice específicamente que imprima no se imprimen, y las líneas que le dice explícitamente que imprima (por ejemplo, con p) se imprimen solo una vez.

  • sed -n '2,3p' test.txt - imprime solo las líneas 2 a 3, según lo solicitado

  • sed '2,3p' test.txt - imprime cada línea (automáticamente), Y TAMBIÉN imprime las líneas 2-3 por segunda vez

  • sed -n 's/t/T/' test.txt - reemplaza "t" con "T" en cada línea, pero no imprime el resultado debido a -n

  • sed 's/t/T/' test.txt - reemplaza "t" con "T" en cada línea e imprime automáticamente el resultado

Y déjenme agregar algunos ejemplos más:

  • sed -n 's/t/T/p' test.txt - reemplaza "t" con "T" en cada línea, imprime SOLAMENTE las líneas donde se realizó la sustitución (es decir, no la "segunda")

  • sed 's/t/T/p' test.txt - reemplaza "t" con "T" en cada línea, imprime las líneas donde tuvo lugar la sustitución, luego imprime automáticamente cada línea (resultado: "segundo" se imprime una vez, todas las demás dos veces)

  • sed '2,3p; 3p' test.txt- imprime las líneas 1, 4 y 5 una vez (la impresión automática); línea 2 dos veces (el primer pcomando, luego la impresión automática), y la línea 3 tres veces (una vez para cada pcomando, luego otra vez automáticamente).

Gordon Davisson
fuente
Gracias Gordon, pero tu evaluación solo repite mi observación. En los dos primeros ejemplos, se imprimió sin -nimprimir cada línea, además de las líneas solicitadas específicamente. Por lo tanto, en ese caso -n suprime la impresión de cada línea analizada . Sin embargo, en el tercer y cuarto ejemplos, el comportamiento es diferente. En esos casos, sed sin -nno genera las líneas dos veces, por lo tanto, el uso -nno suprime la impresión de cada línea analizada, sino que suprime la impresión de líneas no modificadas . Tengo dificultades para generalizar cuándo el comportamiento será uno u otro.
dotancohen
No, en ambos casos -nestá haciendo exactamente lo mismo: cambiar de cada línea que se imprime automáticamente (y el modificador py pa un comando sustituto hace que la línea se imprima más veces) a un modo en el que las líneas se imprimen solo si se lo indica específicamente a (con el pcomando, etc.).
Gordon Davisson
Dicho de otra manera: intente agregar la -nopción Y TAMBIÉN agregue ; pal comando sed (por ejemplo sed -n '2,3p; p', y obtendrá los mismos resultados que tendría sin ninguno. -nSuprime la impresión automática predeterminada y ; pagrega una explícita (en su mayoría equivalente ) imprimir.
Gordon Davisson
Ya veo, gracias. Le agradezco mucho que se haya tomado el tiempo para ayudar a hacer el ejemplo explícito. ¡Que tengan una excelente semana!
dotancohen