Com o padrão sed, você nunca verá uma nova linha no texto lido de um arquivo. Isso ocorre porque sedlê linha por linha e, portanto, não há nova linha no final do texto da linha atual no sedespaço do padrão. Em outras palavras, sedlê dados delimitados por nova linha e os delimitadores não fazem parte do que um sedscript vê.
Expressões regulares podem ser ancoradas no final da linha usando $(ou no início, usando ^). A ancoragem de uma expressão no início / fim de uma linha obriga a corresponder exatamente lá, e não apenas em qualquer lugar na linha.
Se você deseja substituir algo que corresponda ao padrão [A-Za-z]*no final da linha por algo, ancore o padrão da seguinte maneira:
[A-Za-z]*$
... forçará a correspondência no final da linha e em nenhum outro lugar.
No entanto, como [A-Za-z]*$também não corresponde a nada (por exemplo, a cadeia vazia presente no final de cada linha), você precisa forçar a correspondência de algo , por exemplo, especificando
[A-Za-z][A-Za-z]*$
Portanto, sua linha de comando sed será assim
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
Eu não usei o -Eswitch aqui porque não é necessário. Com isso, você poderia ter escrito
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
É uma questão de gosto.
+: você pode usá-lo mesmo sem usar o regex extendido, lembre-se de escrevê-lo como\+. Entãosed -e 's/[A-Za-z]\+$/replace/' file.txt, funcionará perfeitamente mesmo sem o GNUsedinstalado. E não se esqueça: Não use-E, pois o GNUsednão suporta .