Con el estándar sed
, nunca verá una nueva línea en el texto leído de un archivo. Esto se debe a que sed
lee línea por línea y, por lo tanto, no hay una nueva línea al final del texto de la línea actual en sed
el espacio del patrón. En otras palabras, sed
lee datos delimitados por nueva línea, y los delimitadores no son parte de lo que sed
ve un script.
Las expresiones regulares se pueden anclar al final de la línea usando $
(o al principio, usando ^
). Anclar una expresión al inicio / final de una línea la obliga a coincidir exactamente allí, y no en cualquier lugar de la línea.
Si desea reemplazar cualquier cosa que coincida con el patrón [A-Za-z]*
al final de la línea con algo, entonces ancle el patrón de esta manera:
[A-Za-z]*$
... lo obligará a coincidir al final de la línea y en ningún otro lugar.
Sin embargo, dado que [A-Za-z]*$
tampoco coincide con nada (por ejemplo, la cadena vacía presente al final de cada línea), debe forzar la coincidencia de algo , por ejemplo, especificando
[A-Za-z][A-Za-z]*$
Entonces, su línea de comando sed será
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
No utilicé el -E
interruptor aquí porque no es necesario. Con eso, podrías haber escrito
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
Es cuestión de gustos.
+
: PUEDES usarlo incluso sin usar expresiones regulares extendidas, solo recuerda escribirlo como\+
. Asísed -e 's/[A-Za-z]\+$/replace/' file.txt
funcionará perfectamente incluso sin GNUsed
instalado. Y no se debe olvidar: no lo use-E
, ya que GNUsed
no lo admite .