sed editar cadena entre un párrafo específico en un archivo

sed editar cadena entre un párrafo específico en un archivo

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 ORSya que el RTseparador es específico de GNU.

Perl proporciona un modo de párrafo similar mediante la -00opció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.

información relacionada