Mit Standard sehen sed
Sie niemals eine neue Zeile im Text, der aus einer Datei gelesen wird. Dies liegt daran, dass sed
zeilenweise gelesen wird und daher am Ende des Textes der aktuellen Zeile im Musterbereich keine neue Zeile steht sed
. Mit anderen Worten, sed
liest durch Zeilenumbrüche getrennte Daten, und die Trennzeichen sind nicht Teil dessen, was ein sed
Skript 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 -E
Schalter 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.txt
auch ohnesed
installierte GNU einwandfrei . Und nicht zu vergessen: Nicht verwenden-E
, da GNUsed
dies nicht unterstützt .