Com o padrão sed
, você nunca verá uma nova linha no texto lido de um arquivo. Isso ocorre porque sed
lê linha por linha e, portanto, não há nova linha no final do texto da linha atual no sed
espaço do padrão. Em outras palavras, sed
lê dados delimitados por nova linha e os delimitadores não fazem parte do que um sed
script 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 -E
switch 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 GNUsed
instalado. E não se esqueça: Não use-E
, pois o GNUsed
não suporta .