sed, жадность, перл и Super-sed

sed, жадность, перл и Super-sed

Сообщение nezabudka » 07 ноя 2016, 17:02

Я не большой специалист по sed но все же прочла на этапе знакомства
с командной строкой линукс учебник от drBatty (emulek) и вот недавно
за разбором кода на асме и Си я заметила что стала подзабывать
полученные ранее знания. Решила освежить память и нашла этот учебник
на гитхабе http://emulek.github.io/sed/ch02.html
В самом начале столкнулась с ситуацией которую если и знала ранее
то сейчас основательно запамятовала. Есть такое выражение описывающее
жадность плюсиков и звоздочек.
Код: выделить все
echo "ABC-234XYZ+17sss" | sed -r 's/.*([-+]?[0-9]+).*/\1/'
7

Надо исправить жадность первого выражения .* что бы предлагаемую
строку редактор заменил на строку соответствующую шаблону в скобках
и вывел полностью часть строки состоящую из цифр со знаком.
Я решила заменить первую .* на \w что в перловских регулярках
определяется как все цифры, символы и знак подчеркивания, то есть
как в обычных регулярках [a-zA-Z0-9_].
Проверяю и убеждаюсь что sed "скушал" перловский класс символов \w
Код: выделить все
echo "ABC-234XYZ+17sss" | sed -r 's/\w+([-+]?[0-9]+).*/\1/'
-234

а мой кусочек шаблона определил все до знака "-" и не съел больше положенного.
Иду дальше и заменяю класс цифр [0-9] на аналогичный перловский \d
Код: выделить все
echo "ABC-234XYZ+17sss" | sed -rn 's/\w+([-+]?\d+).*/\1/p'

Здесь я добавила опцию -n с командой p что бы было наглядно
видно когда шаблон не совпадает со строкой то ни чего не выводится.
В данном случае это и произошло, вывод отсутствует.
Получается один перловский класс sed принимает, а дургой нет.
На лицо отсутствие логики в действиях редактора. Совсем случайно,
за день до этого я узнала что есть такой усовершенствованный
редактор под названием Super-sed, посмотрим на него и установим
Код: выделить все
sudo apt show ssed
sudo apt install ssed

Что бы этот редактор читал полноценные перловские регулярки
необходимо использовать опцию -R. Попробуем его в действии
Код: выделить все
echo "ABC-234XYZ+17sss" | ssed -Rn 's/\w+([-+]?\d+).*/\1/p'
-234

Вывод говорит сам за себя. Еще раз изменим строчку для наглядности
и выведем сперва класс цифр \d
Код: выделить все
echo "01234abcde" | ssed -R 's/(\d+)(\w+)/\1/'
01234

А теперь класс \w
Код: выделить все
echo "01234abcde" | ssed -R 's/(\d+)(\w+)/\2/'
abcde

Видно что все работает и логика в не опасности.
А для нашего старого друга седа сделаем у себя в памяти напоминалочку.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватар пользователя
nezabudka
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 613
Фото: 180
Стаж: 3 года 5 месяцев 29 дней
Откуда: Ростов на Дону
Благодарил (а): 286 раз.
Поблагодарили: 145 раз.

sed, жадность, перл и Super-sed

Спонсор

Спонсор
 

Вернуться в Командная строка

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron