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
la respuesta más rápida FTW! –