Ze standardową sed
, będzie nigdy zobaczyć nowego wiersza w tekście odczytać z pliku. Jest tak, ponieważ sed
czyta wiersz po wierszu, dlatego nie ma nowej linii na końcu tekstu bieżącej linii w obszarze sed
wzorów. Innymi słowy, sed
czyta dane rozdzielane znakiem nowej linii, a separatory nie są częścią tego, co sed
widzi skrypt.
Wyrażenia regularne można zakotwiczać na końcu wiersza za pomocą $
(lub na początku za pomocą ^
). Zakotwiczenie wyrażenia na początku / końcu linii wymusza dopasowanie dokładnie tam, a nie tylko w dowolnym miejscu linii.
Jeśli chcesz zamienić coś pasujące do wzoru [A-Za-z]*
na końcu linii na coś, a następnie zakotwicz wzór w następujący sposób:
[A-Za-z]*$
... wymusi dopasowanie na końcu linii i nigdzie indziej.
Ponieważ jednak [A-Za-z]*$
również nic nie pasuje (na przykład pusty ciąg obecny na końcu każdej linii), musisz wymusić dopasowanie czegoś , np. Poprzez określenie
[A-Za-z][A-Za-z]*$
lub
[A-Za-z]\{1,\}$
Zatem twoja linia poleceń sed będzie w ten sposób
$ sed 's/[A-Za-z]\{1,\}$/replace/' file.txt
Nie użyłem -E
tutaj przełącznika, ponieważ nie jest potrzebny. Dzięki temu mógłbyś napisać
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
To kwestia gustu.