При использовании стандарта 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
Это вопрос вкуса.
Или длинный сложный ненужный путь:
источник
$
? напр.s/[a-zA-Z]*$/replace/
\+
вместо,*
так как последний допускает нулевые буквы в конце строки; 2) Вы можете использовать класс персонажа[[:alpha:]]
. Итак:sed 's/[[:alpha:]]\+$/replace/' file
-r
опции использует этот синтаксис регулярного выражения .Из (сломанного) фрагмента кода, который вы разместили, вы, похоже, хотите заменить и новую строку. В этом случае привязка регулярных выражений сама по себе не может вам помочь. Следующее является решением:
Сломано:
/[a-zA-Z]\+$/{}
означает применять все, что находится внутри фигур, к строкам, которые соответствуют регулярному выражению.N
означает «добавить следующую строку в активный буфер» (чтоsed
называется «шаблоном пространства»)s///
заявление является вашей обязательной заменой. Теперь это работает, потому что пространство шаблона содержит две последовательные строки, и поэтому новая строка является его частью.источник
Чтобы найти конец строки, просто используйте $ -sign :
Без привязки конца строки:
Без привязки конца строки:
источник