2011-05-04 11 views

Respuesta

8

Solo trata de una sed que no hace nada:

sed '' file 

y

sed -n '' file 

En primer lugar se imprimirá todo el archivo, pero el segundo no lo hará de impresión nada.

+1

la respuesta más rápida FTW! –

3

Esto pone sed en modo silencioso, donde sed suprime todas las salidas excepto cuando se indique explícitamente por un comando p:

-n 
    --quiet 
    --silent 
      By default, sed will print out the pattern space at 
      the end of each cycle through the script. These 
      options disable this automatic printing, and sed 
      will only produce output when explicitly told to 
      via the p command. 

Un ejemplo de esto sería si quería usar sed para simular las acciones de grep:

$echo -e "a\nb\nc" | sed -n '/[ab]/ p' 
a 
b 

sin la -n se obtendría una ocurrencia de c (y dos ocurrencias de a y B)

1
$ echo "a b c d" | sed "s/a/apple/" 
apple b c d

El espacio del patrón se imprime implícitamente.

$ echo "a b c d" | sed -n "s/a/apple/"

No hay salida.

$ echo "a b c d" | sed -n "s/a/apple/p" 
apple b c d

Imprima explícitamente el espacio del patrón.

14

Sed tiene dos lugares para almacenar texto: espacio de patrón y espacio de espera. El espacio de patrón es donde cada línea se procesa mediante comandos sed; espacio de espera es un lugar auxiliar para colocar algún texto que desee usar más adelante. Probablemente usará solo espacio de patrones.

Antes de que sed procese una línea, se coloca en el espacio del patrón. Luego, sed aplica todos los comandos (como s///) al espacio de patrones y, de forma predeterminada, imprime el texto resultante del espacio del patrón. Supongamos que tenemos un archivo myfile con una línea como:

The quick brown fox jumps over the lazy dog. 

Ejecutamos el siguiente comando:

sed 's/fox/coati/;s/dog/dingo/' myfile 

sed aplicará s/fox/coati/ y luego s/dog/dingo/ para cada línea y en algún momento obtendremos la línea citada. Cuando esto ocurre, se va a poner la línea en el espacio de patrones, que tendrá el siguiente contenido:

The quick brown fox jumps over the lazy dog. 

Entonces, sed va a ejecutar el primer comando.Después de sed ejecuta el comando s/fox/coati/, el contenido del espacio de patrones será:

The quick brown coati jumps over the lazy dog. 

Entonces sed aplicará el segundo comando, que es s/dog/dingo/. Después de eso, el contenido del espacio del patrón será:

The quick brown coati jumps over the lazy dingo. 

Tenga en cuenta que esto solo ocurre en la memoria: nada está impreso hasta ahora.

Después de que se hayan aplicado todos los comandos a la línea actual, de forma predeterminada, sed obtendrá el contenido del espacio del patrón y lo imprimirá en la pantalla. Sin embargo, cuando se da -n como una opción para sed, está pidiendo a sed que no ejecute este último paso excepto si es explícita la requerida. Por lo tanto, si ejecuta

sed -n 's/fox/coati/;s/dog/dingo/' myfile 

, no se imprimirá nada.

Pero, ¿cómo podría solicitar explícitamente sed para imprimir el espacio del patrón? Bueno, puedes usar el comando p. Cuando sed encuentre este comando, imprimirá el contenido del espacio del patrón de inmediato. Por ejemplo, en el que a continuación solicitamos sed que muestre el contenido del espacio de patrones justo después del primer comando:

sed -n 's/fox/coat/;p;s/dog/dingo/' myfile 

El resultado será

$ sed -n 's/fox/coati/;p;s/dog/dingo/' myfile 
The quick brown coati jumps over the lazy dog. 

en cuenta que sólo se sustituye fox. Sucede porque el segundo comando no se ejecutó antes de que se imprima el espacio del patrón. Si queremos imprimir el espacio de patrones después de que ambos comandos, sólo hay que poner p después de la segunda:

sed -n 's/fox/coati/;s/dog/dingo/;p' myfile 

Sólo una nota: se puede pasar la bandera p al comando s/// también:

sed -n 's/fox/coati/;s/dog/dingo/p' myfile 

Es un poco raro AFAIK pero tiene la ventaja de que la línea se imprimirá solo el reemplazo marcado se ejecutó. Puede ser muy útil a veces.

HTH

+1

+1 para una respuesta muy detallada –

Cuestiones relacionadas