
Tengo un archivo llamado a.txt. Y contiene los siguientes contenidos. No se sabe cuántas líneas hay entre cada función.
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "test";
)
function c(
properties pro= "test";
)
quiero editar
function b(
line 1;
line 2;
line ...;
properties pro= "test";
)
a lo siguiente
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
¿Es posible utilizar comandos de una línea como sed o awk?
Respuesta1
Siempre que sus funciones estén delimitadas en párrafos por una o más líneas en blanco como se muestra, entonces podría usar awk con un separador de registros vacío. En particular, con GNU awk:
$ gawk '
BEGIN{RS=""}
/^function b/ {sub(/properties pro= "test"/,"properties pro= \"replace\"")}
{printf "%s%s", $0, RT}
' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
function c(
properties pro= "test";
)
También puede utilizar awk que no sea GNU, pero necesitará establecer un separador de registros de salida fijo ORS
ya que el RT
separador es específico de GNU.
Perl proporciona un modo de párrafo similar mediante la -00
opción.
Con sed, podría usar un rango de direcciones de expresión regular para limitar el alcance de la sustitución, por ejemplo.
$ sed '/^function b/,/^)$/s/properties pro= "test"/properties pro= "replace"/' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
function c(
properties pro= "test";
)
Sin embargo, tenga en cuenta que las cosas que pueden ser sintácticamente neutrales en su "lenguaje" (como líneas en blancodentrouna función) puede romper este enfoque; por esta razón, las expresiones regulares suelen ser una mala elección para este tipo de tareas.