GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo el comando Sed '1!g;h;$!d' invierte el contenido de un archivo?

Mi pregunta está relacionada con el sed -solución específica dada en esta respuesta para esta pregunta de grepping inverso. El sed /grep solución que no puedo descifrar es la siguiente:

sed '1!G;h;$!d' file

¿Alguien puede descifrar este comando?

Sé por el conocimiento de VI(M) que G denota la última línea del archivo y que en sed un bang(!) seguido de una dirección funciona un poco como grep -v es decir que no coincidirá con esa línea. Pero en general, el script sed en línea anterior está más allá de mí.

Respuesta aceptada:

Esto invierte el archivo línea por línea.

sed '1!G;h;$!d' file

Primero, sed tiene un espacio de espera y un espacio patrón . Tenemos que distinguir entre ellos antes de concentrarnos en ese comando específico.

Cuando sed lee una nueva línea, se carga en el espacio del patrón. Por lo tanto, ese espacio se sobrescribe cada vez que se procesa una nueva línea. Por otro lado, el espacio de retención es consistente durante todo el procesamiento y los valores se pueden almacenar allí para su uso posterior.

Al comando:

Hay 3 comandos en esta declaración:1!G , h y $!d

  • 1!G significa que la G El comando se ejecuta en todas las líneas excepto en la primera (el ! niega el 1 ). G significa añadir lo que está en el espacio de retención en el espacio del patrón.

  • h se aplica a cada línea. copia el espacio del patrón al espacio de retención (y lo sobrescribe).

  • $!d se aplica a todas las líneas excepto a la última ($ representa la última línea, ! lo niega). d es el comando para eliminar la línea (espacio del patrón).

  1. Ahora, cuando se lea la primera línea, sed ejecuta el h dominio. La primera línea se copia en el espacio de espera. Luego se elimina, ya que coincide con el $! condición. sed continúa con la segunda línea.
  2. ¡La segunda línea coincide con la condición 1! (no es la primera línea), por lo que el espacio de retención (que tiene la primera línea) se agrega al espacio del patrón (que tiene la segunda línea). Después de eso, en el espacio del patrón, ahora está la segunda línea seguida de la primera línea, delimitada por una nueva línea. Ahora, el h se aplica el comando (como en cada línea); todo lo que está en el espacio del patrón se copia en el espacio de espera. La tercera sentencia ($!d ) se aplica:la línea se elimina del espacio del patrón.
  3. El paso 2 ya está hecho con todas las líneas. Saltamos a la última línea.
  4. En la última línea ($ ) casi todo el paso 2 está hecho, pero no la parte de eliminación (d ). sed , cuando se invoca sin -n , imprime el espacio del patrón automáticamente al final del procesamiento para cada línea de entrada. Entonces, cuando no se elimina, se imprime el espacio del patrón. Ahora contiene todas las líneas en orden inverso .
Relacionado:¿Parchear un binario con dd?
Linux
  1. ¿Cómo pasar el contenido de un archivo como un parámetro de línea de comando?

  2. ¿Comando rápido de Unix para mostrar líneas específicas en medio de un archivo?

  3. ¿Cómo montar desde la línea de comandos como lo hace el Nautilus?

  4. ¿Cómo calcula el comando stat los bloques de un archivo?

  5. ¿Cómo agregar la salida a un archivo?

Cómo usar el comando sed de Linux

Ver el contenido de un archivo en la línea de comandos de Linux

Cómo quitar líneas de un archivo usando el comando Sed

¿Cómo sabe el comando Xdg-open qué aplicación usar para abrir un archivo?

¿Cómo leer la penúltima línea en un archivo usando Bash?

¿Cómo obtener la URL del archivo de Dropbox desde la línea de comando?