Вам нужно изменить строку или просто найти все после последнего подчеркивания?Регулярное выражение для поиска последнего _ {что-нибудь} будет /(_[^_]+)$/
($ соответствует концу строки), или, если вы также хотите сопоставить завершающее подчеркивание с ничем после него, /(_[^_]*)$/
.
Если вам действительно не нужно изменять строку вместо того, чтобы просто находить этот фрагмент, или вы действительно хотите сделать это из командной строки вместо сценария, это регулярное выражение немного проще (вы пометили это какperl, так что я не совсем уверен, насколько вы привержены использованию только командной строки, в отличие от простого сценария, которым вы были).
Если вам нужно изменить строку на месте, sed -i 's/(_[^_]+)$/\1/' myfile
или sed -i 's/(_[^_]+)$/\1/g' myfile
.-i
(правка: я решил не лениться и посмотреть правильный синтаксис ...) флаг -i
просто перезапишет старый файл новым.Если вы хотите создать новый файл, а не ударить старый, sed -e 's/.../.../g' oldfile > newfile
.g
после s///
сделает это для всех экземпляров файла, который вы передаете в sed;оставив его, он просто заменяет первый экземпляр.
Если строка не сама по себе в конце строки, а скорее встроена в другой текст.но только через пробел замените $
на \s
, который будет соответствовать символу пробела (конец слова).