GNU/Linux >> Tutoriales Linux >  >> Linux

Sed:¿Insertar texto después del enésimo carácter antes o después de una cadena determinada?

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

Linux
  1. Eliminar ocurrencias de cadena en archivo de texto

  2. Eliminar líneas pares o impares de un archivo de texto

  3. sed - insertar línea después de X líneas después del partido

  4. Encuentre y reemplace texto en un archivo entre un rango de líneas usando sed

  5. ¿Cómo inserto texto en la primera línea de un archivo usando sed?

¿Reemplazar el patrón después de encontrar la enésima coincidencia en cada línea?

¿Cómo eliminar varias líneas aleatorias de un archivo de texto usando Sed?

¿Usar Sed para agregar un carácter en la posición N de la cadena coincidente?

¿Eliminar línea que contiene cierta cadena y la siguiente línea?

Tutorial de Unix Sed:anexar, insertar, reemplazar y contar líneas de archivos

¿Cómo configurar el cursor después del último carácter en vim?