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;&/"