Avec standard sed
, vous ne verrez jamais de nouvelle ligne dans le texte lu à partir d'un fichier. En effet, sed
lit ligne par ligne, il n'y a donc pas de nouvelle ligne à la fin du texte de la ligne courante dans sed
l'espace de motif de. En d'autres termes, sed
lit les données délimitées par des sauts de ligne et les délimiteurs ne font pas partie de ce qu'un sed
script 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 -E
commutateur 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.txt
fonctionnera donc parfaitement même sans GNUsed
installé. Et à ne pas oublier: ne l'utilisez pas-E
, car GNUsed
ne le prend pas en charge .