
Usando sed (GNU sed) 4.2.2, quiero:
- Fósforo
Line1
- Comprueba
Line2
, justo debajoLine1
, si es igualString
- Si no es así, agregue
String
despuésLine1
(o inserte antesLine2
)
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 Line1
seguidas, 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
String
de otra nueva línea.