Avec standard sed, vous ne verrez jamais de nouvelle ligne dans le texte lu à partir d'un fichier. En effet, sedlit ligne par ligne, il n'y a donc pas de nouvelle ligne à la fin du texte de la ligne courante dans sedl'espace de motif de. En d'autres termes, sedlit les données délimitées par des sauts de ligne et les délimiteurs ne font pas partie de ce qu'un sedscript voit.
Les expressions régulières peuvent être ancrées à la fin de la ligne en utilisant $(ou au début, en utilisant ^). L'ancrage d'une expression au début / à la fin d'une ligne la force à correspondre exactement là, et pas seulement n'importe où sur la ligne.
Si vous souhaitez remplacer quelque chose correspondant au motif [A-Za-z]*à la fin de la ligne par quelque chose, puis ancrer le modèle comme ceci:
[A-Za-z]*$
... le forcera à correspondre à la fin de la ligne et nulle part ailleurs.
Cependant, puisque ne[A-Za-z]*$ correspond également à rien (par exemple, la chaîne vide présente à la fin de chaque ligne), vous devez forcer la correspondance de quelque chose , par exemple en spécifiant
[A-Za-z][A-Za-z]*$
Ainsi, votre ligne de commande sed sera donc
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
Je n'ai pas utilisé le -Ecommutateur ici car il n'est pas nécessaire. Avec ça, vous auriez pu écrire
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
C'est une question de goût.
+: vous pouvez l'utiliser même sans utiliser l'expression régulière étendue, n'oubliez pas de l'écrire comme\+. Celased -e 's/[A-Za-z]\+$/replace/' file.txtfonctionnera donc parfaitement même sans GNUsedinstallé. Et à ne pas oublier: ne l'utilisez pas-E, car GNUsedne le prend pas en charge .