Résumé
Syntaxe GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
Ou même (pour n'utiliser qu'une seule fois le mot à remplacer:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
Ou, dans la syntaxe POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
fonctionne sur n'importe quel sed, traite uniquement autant de lignes que nécessaire pour trouver la première claudio
, fonctionne même s'il claudio
est dans la première ligne et est plus court car il n'utilise qu'une seule chaîne d'expression régulière.
Détail
Pour modifier une seule ligne, vous devez sélectionner une seule ligne.
L'utilisation d'un 1,/claudio/
(à partir de votre question) sélectionne:
- à partir de la première ligne (sans condition)
- à la ligne suivante qui contient la chaîne
claudio
.
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
Pour sélectionner une ligne qui contient claudio
, utilisez:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
Et pour ne sélectionner que le premier claudio
du fichier, utilisez:
sed -n '/claudio/{p;q}' file
claudio 1
Ensuite, vous pouvez effectuer une substitution uniquement sur cette ligne:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
Ce qui ne changera que le premier occurrence de la correspondance d'expression régulière sur la ligne, même s'il peut y en avoir plusieurs, sur la première ligne qui correspond à l'expression régulière.
Bien sûr, l' /claudio/
expression rationnelle pourrait être simplifiée pour:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
Et puis, la seule chose qui manque est d'imprimer toutes les autres lignes non modifiées:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
: (0,/REGEXP/
: Un numéro de ligne de 0 peut être utilisé dans une spécification d'adresse comme0,/REGEXP/
poursed
essayer de faire correspondre REGEXP dans la première ligne d'entrée également. En d'autres termes,0,/REGEXP/
est similaire à1,/REGEXP/
, sauf que si ADDR2 correspond à la toute première ligne d'entrée, le formulaire 0, / REGEXP / le considérera comme mettant fin à la plage, tandis que le formulaire 1, / REGEXP / correspondra au début de sa plage et donc étendra la plage jusqu'à la deuxième occurrence de l'expression régulière)