Usando sed
, ¿cómo se insertaría texto después de un carácter que precede (o sigue) alguna cadena por N
ocurrencias Como ejemplo, supongamos que la línea de texto a editar es la siguiente:
command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'
Después de encontrar esta línea en un archivo de texto (quizás a través de la cadena única command
), deseo insertar texto después del segundo (N=2) punto y coma antes de keyword
(es decir, el punto y coma que separa las lines
y of
). Específicamente me gustaría usar sed
para el propósito.
Continuando con este ejemplo, el resultado esperado sería:
command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'
donde INSERTED_STRING;
(proporcionado a sed, por ejemplo, a través de una variable de shell) se insertó en la posición deseada.
Respuesta aceptada:
Lo prefiero simple:
sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'
para insertar dos campos antes de la palabra clave. La solución general sería
sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"
pero tenga en cuenta que el N
tiene un descuento de 1 en comparación con su pregunta:Aquí, N=2
significa tener dos campos entre el inserto y la keyword
.
Explicación:/command/
selecciona solo líneas con command
, por lo que otras líneas permanecen intactas. ([^;]*;\)
coincide con un campo (una secuencia de no punto y coma) incluido el siguiente punto y coma. Siguiéndolo con \{$N\}
el patrón coincide con $N
los campos. La siguiente keyword
completa esto para que coincida con keyword
y el $N
campos antes. El patrón de reemplazo consta de la cadena insertada y &
, que se reemplaza por todo lo que coincidía (por lo que, al final, no fue un reemplazo, sino una inserción).
Abreviado y mejor legible con expresiones regulares extendidas:
sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"