sed, agregue línea en la coincidencia solo si aún no existe

sed, agregue línea en la coincidencia solo si aún no existe

Usando sed (GNU sed) 4.2.2, quiero:

  1. FósforoLine1
  2. Comprueba Line2, justo debajo Line1, si es igualString
  3. Si no es así, agregue Stringdespués Line1(o inserte antes Line2)

Lo que probé:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/n;/^String$/!iString'

pero vuelve:

Línea1
Cadena
Línea2
Cadena
Línea3

También probé:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/{n;/^String$/!iString}'

pero regresa

sed: -e expresión #1, carácter 0: no coincidente `{'

Sé cómo hacerlo de otra manera, también usando sed, pero trato de entender cómo lograrlo exactamente como lo describí anteriormente. Además, dígame qué hay de malo en mi código.

Respuesta1

Intentar:

sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file

Limitación: Si aparecen dos líneas Line1seguidas, esto puede o no hacer lo que desea.

Ejemplo

Consideremos este archivo de prueba:

$ cat file
Line1
String
Line2
String
Line3
Line1
Line2

Y apliquemos nuestro comando:

$ sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
Line1
String
Line2
String
Line3
Line1
String
Line2

Cómo funciona

  • Line1/{...}

    Esto ejecuta los comandos entre llaves solo si la línea actual coincide con la expresión regular Line1.

  • N

    Esto lee la siguiente línea y la agrega a la línea actual con las dos líneas separadas por una nueva línea.

  • /\nString$/b

    Si la segunda línea coincide con la expresión regular \nString$, omita el resto de los comandos ("rama", b).

  • s/\n/\nString\n/

    Esto reemplaza la nueva línea que separa la primera y la segunda línea con una nueva línea seguida Stringde otra nueva línea.

información relacionada