Con lo standard sed
, non vedrai mai una nuova riga nel testo letto da un file. Questo perché sed
legge riga per riga e pertanto non esiste una nuova riga alla fine del testo della riga corrente nello sed
spazio del modello. In altre parole, sed
legge i dati delimitati da newline e i delimitatori non fanno parte di ciò che sed
vede uno script.
Le espressioni regolari possono essere ancorate alla fine della riga usando $
(o all'inizio, usando ^
). L'ancoraggio di un'espressione all'inizio / alla fine di una linea la costringe a corrispondere esattamente lì, e non solo in qualsiasi punto della linea.
Se vuoi sostituire qualcosa che corrisponda al motivo [A-Za-z]*
alla fine della linea con qualcosa, quindi ancorando il motivo in questo modo:
[A-Za-z]*$
... lo costringerà a corrispondere alla fine della linea e in nessun altro posto.
Tuttavia, poiché non[A-Za-z]*$
corrisponde a nulla (ad esempio, la stringa vuota presente alla fine di ogni riga), è necessario forzare la corrispondenza di qualcosa , ad esempio specificando
[A-Za-z][A-Za-z]*$
o
[A-Za-z]\{1,\}$
Quindi, la tua riga di comando sed sarà così
$ sed 's/[A-Za-z]\{1,\}$/replace/' file.txt
Non ho usato l' -E
interruttore qui perché non è necessario. Con esso, avresti potuto scrivere
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
È una questione di gusti.