Resumen
Sintaxis de GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
O incluso (para usar solo una vez la palabra a reemplazar:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
O, en la sintaxis POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
funciona en cualquier sed, procesa solo tantas líneas como sea necesario para encontrar el primero claudio
, funciona incluso si claudio
está en la primera línea y es más corto ya que usa solo una cadena de expresiones regulares.
Detalle
Para cambiar solo una línea , debe seleccionar solo una línea.
Usando un 1,/claudio/
(de su pregunta) selecciona:
- desde la primera línea (incondicionalmente)
- a la siguiente línea que contiene la cadena
claudio
.
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
Para seleccionar cualquier línea que contenga claudio
, use:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
Y para seleccionar solo el primero claudio
en el archivo, use:
sed -n '/claudio/{p;q}' file
claudio 1
Luego, puede hacer una sustitución solo en esa línea:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
Lo que cambiará solo la primera aparición de la coincidencia de expresiones regulares en la línea, incluso si puede haber más de una, en la primera línea que coincida con la expresión regular.
Por supuesto, la /claudio/
expresión regular podría simplificarse para:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
Y, entonces, lo único que falta es imprimir todas las demás líneas sin modificar:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
: (0,/REGEXP/
: Se puede usar un número de línea de 0 en una especificación de dirección como0,/REGEXP/
para quesed
también intente hacer coincidir REGEXP en la primera línea de entrada. En otras palabras,0,/REGEXP/
es similar a1,/REGEXP/
, excepto que si ADDR2 coincide con la primera línea de entrada, el formulario 0, / REGEXP / considerará que finaliza el rango, mientras que el formulario 1, / REGEXP / coincidirá con el comienzo de su rango y, por lo tanto, hará que el rango abarque hasta la segunda aparición de la expresión regular)