Mit Standard sehen sedSie niemals eine neue Zeile im Text, der aus einer Datei gelesen wird. Dies liegt daran, dass sedzeilenweise gelesen wird und daher am Ende des Textes der aktuellen Zeile im Musterbereich keine neue Zeile steht sed. Mit anderen Worten, sedliest durch Zeilenumbrüche getrennte Daten, und die Trennzeichen sind nicht Teil dessen, was ein sedSkript sieht.
Reguläre Ausdrücke können am Ende der Zeile mit (oder am Anfang mit ) verankert$ werden ^. Wenn Sie einen Ausdruck am Anfang / Ende einer Zeile verankern, wird er genau dort und nicht nur irgendwo in der Zeile angezeigt.
Wenn Sie etwas, das mit dem Muster [A-Za-z]*am Ende der Zeile übereinstimmt, durch etwas ersetzen möchten , verankern Sie das Muster wie folgt:
[A-Za-z]*$
... erzwingt, dass es am Ende der Zeile und nirgendwo anders übereinstimmt.
Da jedoch [A-Za-z]*$auch nichts übereinstimmt (z. B. die leere Zeichenfolge am Ende jeder Zeile), müssen Sie den Abgleich von etwas erzwingen , z. B. durch Angabe
[A-Za-z][A-Za-z]*$
So wird Ihre sed Kommandozeile also sein
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
Ich habe den -ESchalter hier nicht verwendet , weil er nicht benötigt wird. Damit hättest du schreiben können
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
Es ist Geschmackssache.
+zum Thema : Sie können es auch ohne erweiterten regulären Ausdruck verwenden. Denken Sie daran, es so zu schreiben\+. Funktioniert alsosed -e 's/[A-Za-z]\+$/replace/' file.txtauch ohnesedinstallierte GNU einwandfrei . Und nicht zu vergessen: Nicht verwenden-E, da GNUseddies nicht unterstützt .