При использовании стандарта sedвы никогда не увидите новую строку в тексте, прочитанном из файла. Это потому, что sedчитает строку за строкой, и, следовательно, нет новой строки в конце текста текущей строки в sedпространстве образца. Другими словами, sedчитает данные с разделителями новой строки, и разделители не являются частью того, что sedвидит скрипт.
Регулярные выражения можно закрепить в конце строки, используя $(или в начале, используя^ ). Привязка выражения в начале / конце строки вынуждает его совпадать именно там, а не где-нибудь в строке.
Если вы хотите заменить что-либо, совпадающее с шаблоном [A-Za-z]*в конце строки, чем-то, то закрепите шаблон следующим образом:
[A-Za-z]*$
... заставит его совпадать в конце строки и нигде больше.
Однако, поскольку [A-Za-z]*$также ничего не совпадает (например, пустая строка присутствует в конце каждой строки), вам необходимо принудительно сопоставить что-либо , например, указав
[A-Za-z][A-Za-z]*$
или
[A-Za-z]\{1,\}$
Таким образом, ваша командная строка sed будет
$ sed 's/[A-Za-z]\{1,\}$/replace/' file.txt
Я не использовал -Eпереключатель здесь, потому что он не нужен. С его помощью вы могли бы написать
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
Это вопрос вкуса.