За допомогою стандарту 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
Це питання смаку.