LINUX.ORG.RU

регулярное выражение

 


0

1

Всем привет.

Что-то туплю я с поведением простого выражения. Надо: просто получить 4 символа в конце одного выражения. Что может быть проще? Но почему мне этот вариант:

echo "hello_world_release-0003-1-g8dc5266" |  sed -e 's/\(....\)$/\1/'

выдаёт hello_world_release-0003-1-g8dc5266 ? Вот такой вариант, например, работает без проблем:

velik@sve:/home/TMP/$ echo "hello_world_release-0003-1-g8dc5266" |  sed -e 's/.*\(....\)$/\1/'                                       
5266

Где я туплю? Разве \(....\)$ не означает, что не надо 4 символа с конца строки?

Всем спасибо, velik


Где я
туплю?
Разве \(....\)$ не означает, что не надо 4 символа с конца строки?

1.ЛОР 2. Да 3. Четыре точки это четыре любых символа

anonymous ()

Во-первых:

.{4}
Во-вторых, в первом случае ты заменишь только строки ровно из четырёх символов, другие естественно останутся в первозданном виде. man sed.

Kalashnikov ★★★ ()

s - замена. Ты меняешь 4 последних символа... на 4 последних символа, получая ту же строку. Ее и выводишь.

ksv ()
Ответ на: комментарий от velikS

Шелопроблемы. Ни то, ни другое не читается. Да и вообще, глупо спорить о читаемости регэкспов или седа, а тем более и того и другого вместе. (..............................) тоже легче читается?

В твоём случае вообще \d по-моему надо, да с шаблоном остальной строки.

Kalashnikov ★★★ ()
Ответ на: комментарий от velikS

Синтаксис базовых регулярных выражений на данный момент определён POSIX как устаревший, но он до сих пор широко распространён из соображений обратной совместимости.

Эпитомия шелопроблем.

Kalashnikov ★★★ ()
Ответ на: комментарий от anarquista

Но такая команда будет выводить и строки менее 4 символов длиной :(

anarquista ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.