GNU/Linux >> Tutoriales Linux >  >> Linux

sed para insertar solo en la primera coincidencia

Puede hacer esto en GNU sed:

sed '0,/Matched Keyword/s//New Inserted Line\n&/'

Pero no es portátil. Como la portabilidad es buena, aquí está en awk:

awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile

O, si desea pasar una variable para imprimir:

awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile

Ambos insertan la línea de texto antes la primera aparición de la palabra clave, en una sola línea, según su ejemplo.

Recuerde que tanto con sed como con awk, la palabra clave coincidente es una expresión regular, no solo una palabra clave.

ACTUALIZACIÓN:

Dado que esta pregunta también está etiquetada como bash, aquí hay una solución simple que es puro bash y no requiere sed:

#!/bin/bash

n=0
while read line; do
  if [[ "$line" =~ 'Matched Keyword' && $n = 0 ]]; then
    echo "New Inserted Line"
    n=1
  fi
  echo "$line"
done

Tal como está, esto como una pipa. En su lugar, puede envolverlo fácilmente en algo que actúe sobre los archivos.


Si quieres uno con sed*:

sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt

*solo funciona con GNU sed


Esto podría funcionar para usted:

sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file

¡Ya casi estás allí! Simplemente cree un bucle para leer desde el Matched Keyword hasta el final del archivo.

Después de insertar una línea, el resto del archivo se puede imprimir:

  1. Presentamos un marcador de posición de bucle :a (aquí a es un nombre arbitrario).
  2. Imprime la línea actual y busca la siguiente en el espacio del patrón con el n comando.
  3. Redirigir el control de regreso usando el ba comando que es esencialmente un goto al a titular de lugar El n se ocupa naturalmente de la condición de fin de archivo. comando que finaliza cualquier otro comando sed si intenta leer pasado el final del archivo.

Con un poco de ayuda de bash, se puede lograr una verdadera frase:

sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file

Alternativa:

sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file

Esto usa el Matched Keyword como una bandera en el espacio de espera y, una vez que se ha establecido, cualquier procesamiento se reduce mediante el rescate inmediato.


Linux
  1. grep coincide solo con líneas en un rango específico

  2. línea de inserción sed con espacios a una línea específica

  3. script bash agrega texto a la primera línea de un archivo

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

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

¿Cómo insertar texto antes de la primera línea de un archivo?

¿Imprimir línea anterior después de una coincidencia de patrón usando Sed?

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

¿Devolver solo la parte de una línea después de un patrón coincidente?

¿Sed On Osx Insert en cierta línea?

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