Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60

Ещё раз о жадности sed и выводе регулярок

28.11.2017, 08:56. Показов 3799. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Появилось желание вывести все регулярки из текста с помощью sed.

Вот так, очевидно, сожрётся всё и останется одна регулярка в конце.
Bash
1
sed -nr 's/.*(regex).*/\1/gp'  file
Тогда я попробовал по старому совету Marinero обозначить границы регулярки, чтобы убрать жадность.
Bash
1
sed -nr 's/[^r]*(regex)[^r]*/\1/gp'  file
Вывело все регэкспы что были.

Но тут я решил вставить уже реальную регулярку и всё пошло не так:
Bash
1
sed -nr 's/[^0-9]*([1-9]{1,3}(\ [0-9]{1,3}){2,})[^0-9]*/\1/gp'  file
Безотносительно смысла самой регулярки (она ищет числа больше лимона разделенные на тройки, вместо неё могла быть любая другая) ...что я делаю не так? Выводит дичь какую-то.

Если можно без циклов покажите как регексп дать соответствующий. Ну а если так нельзя то с циклом.

PS Я знаю про
Bash
1
grep -oE 'regexp' file
но это для слабаков.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2017, 08:56
Ответы с готовыми решениями:

Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз его
Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот символ. Pезультат вывести...

Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот символ
Помогите с задачей на C# Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот...

Почему при выводе односвязного списка на экран он выдаёт ещё какие-то дополнительные адреса?
Здравствуйте, помогите пожалуйста разобраться, почему при выводе односвязного списка на экран он мне выдаёт ещё какие-то дополнительные...

11
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
28.11.2017, 20:04
Не совсем понятно что именно Вы делаете. Приведите образец и что хотите из него получить.
0
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60
29.11.2017, 01:16  [ТС]
Допустим есть регулярка
[1-9]{1,3}(\ [0-9]{3}){2,}

Если проверить тут https://regexr.com/ то она выделит цифры больше миллиона разделенные пробелом по три:
Welcome to RegExr v2.1 by gskinner.com, proudly hosted by Media Temple!

Edit the Expression & Text to see matches. Roll over matches or the expression for details. Undo mistakes with ctrl-z. Save Favorites & Share expressions with friends or the Community. Explore your results with Tools. A full Reference & Help is available in the Library, or watch the video Tutorial.
120
1500 000
1 500 000
3 000 000 000
53 111 222 000 000 000 000 000 000

Sample text for testing:
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 _+-.,!@#$%^&*();\/|<>"'
12345 -98.7 3.141 .6180 9,000 +42
555.123.4567 +1-(800)-555-2468
foo@demo.net bar.ba@test.co.uk
www.demo.com http://foo.co.uk/
http://regexr.com/foo.html?q=bar
https://mediatemple.net
Я хочу чтобы sed из файла с таким же текстом вывел мне на экран эти совпадения. И пытаюсь ему эту регулярку дать как шаблон того, что надо выводить в замене.
Кроме замены, интересно, у сед вообще есть функция вывода регекспа аналогично grep? Но это не так важно, как разобраться с заменой текста на шаблон без жадности. Чтобы он вывел все совпадения шаблону, а не первое или последнее.
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
29.11.2017, 11:33
Hermod,
русским языком нужно тоже пользоваться правильно.

Как Чехов ( Tchehoff ).

Который написал бы так:
"Душечка, выведите из текста с помощью sed все последовательности символов, которые совпадают с регулярным выражением [1-9]{1,3}(\ [0-9]{3}){2,}"

Добавлено через 24 минуты
Но Маяковский использовал бы perl. Однозначно.

Bash
1
perl -0ne '$, = "\n";   print /[1-9]{1,3}(?:\ [0-9]{3}){2,}/g' file.txt
0
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60
29.11.2017, 22:41  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
выведите из текста с помощью sed все последовательности символов, которые совпадают с регулярным выражением
Я собственно это и написал:
Цитата Сообщение от Hermod Посмотреть сообщение
вывести все регулярки из текста с помощью sed
По-моему "вывести регулярку" вполне не двусмысленное понятие.
Цитата Сообщение от volodin661 Посмотреть сообщение
Но Маяковский использовал бы perl. Однозначно.
От него он и застрелился потом

PS Ваш вариант рабочий Но я хочу разобраться с тем как это делается именно на sed.

Добавлено через 4 минуты
Скажите а зачем вы добавили в РВ "?:" что это означает?
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
29.11.2017, 23:22
Цитата Сообщение от Hermod Посмотреть сообщение
По-моему "вывести регулярку" вполне не двусмысленное понятие.
Регулярное выражение может существовать и само по себе - без исполнения,
то есть, это вполне себе автономный программный об'ект, который можно передавать, скажем, в другие модули, который можно компилировать, в котором могут интерполироваться внешние переменные ( как в Perl ). По сути регулярное выражение это встроенный язык программирования с неприятным синтаксисом, где его метасимволы это суть вызов подпрограмм, а аргументами являются
символы обрабатываемого текста.

Именно по этой причине мне категорически не нравится словосочетание 'вывести регулярку' вместо 'выполнить регулярное выражение'.

Цитата Сообщение от Hermod Посмотреть сообщение
Скажите а зачем вы добавили в РВ "?:" что это означает?
(?: some code) - это незахватывающие скобки.
можешь заменить (?:\ [0-9]{3}) на (\ [0-9]{3}) и посмотреть, что получится.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
30.11.2017, 02:11
"регулярка" суть жаргонное сокращение от словосочетания "регулярное выражение", которое, по простому говоря, есть набор символов и метасимволов, с помощью которого описывают подстроку, которая должна соответствовать данному регулярному выражению. Поэтому Ваше "вывести регулярку" просто невозможно в принципе. "Вывести подстроку соответствующую регулярному выражению" - вот так наверно правильно.
Что касается Вашего желания изобрести универсальный инструмент на все случаи жизни то скорее всего оно несбыточно. Тем хорош линукс что в нем существует узкоспециализированный инструмент для определенной задачи. И использовать что-то другое сравни попытке забивать гвозди плоскогубцами. Можно конечно, только зачем? Ведь есть молоток.
Если же вопрос про искусственное усложнение своей "жизни" для более углубленного изучения инструмента, то "жадность" в данном случае регулируется совсем не так. Тем не менее в приведенном примере выводит то что надо:
Code
1
2
3
1 500 000 
3 000 000 000
53 111 222 000 000 000 000 000 000
0
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60
02.12.2017, 21:57  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
Именно по этой причине мне категорически не нравится словосочетание 'вывести регулярку' вместо 'выполнить регулярное выражение'.
Возможно вы правы. Однако любой символ это регулярное выражение самого себя. Не так ли? Получаетя вывести "привет" это есть вывести регулярное выражение "привет".
Цитата Сообщение от Marinero Посмотреть сообщение
Вывести подстроку соответствующую регулярному выражению" - вот так наверно правильно.
Ок учту.
Цитата Сообщение от Marinero Посмотреть сообщение
И использовать что-то другое сравни попытке забивать гвозди плоскогубцами. Можно конечно, только зачем? Ведь есть молоток.
Вы про то что седом не нужно это делать? Но мне интересно разобраться в нюансах его работы.
Цитата Сообщение от Marinero Посмотреть сообщение
то "жадность" в данном случае регулируется совсем не так
А можно узнать как? У меня хтмл теги сед жрёт.
0
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60
28.12.2018, 02:49  [ТС]
Итак, возвращаемся к нашим баранам.
На этот раз исполняю комманду:
Bash
1
sudo blkid /dev/sda3
Она выводит допустим:
/dev/sda5: UUID="11R159H3BS8BW5J3" TYPE="ntfs" PARTUUID="q175k1n1-47"

Мне нужно "выкусить" sed_om (и только им) UUID. При этом не по позициям символов а по содержанию строки.

Я пишу
Bash
1
sudo blkid /dev/sda3 | sed -r 's/.*UUID=\"(.*)\".*/\1/'
И ожидаю что он мне выведет цифробукевнную аббривеатуру после UUID=" и до первой "
Т.е. я ожидаю увидеть в выводе:
11R159H3BS8BW5J3
Однако вместо этого sed выводит
q175k1n1-47"

Опять проблемы жадности, как я понимаю.

Обьясните в чем ошибка?
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
28.12.2018, 09:13
Цитата Сообщение от Hermod Посмотреть сообщение
q175k1n1-47"
Странно. Непонятно, откуда бы вот этой двойной кавычке взяться на выходе?
0
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60
28.12.2018, 09:43  [ТС]
Перепроверил. Выводит без кавычки.
Просто q175k1n1-47

Однако это не то, что я хочу
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
28.12.2018, 15:58
Цитата Сообщение от Hermod Посмотреть сообщение
и только им
Опять какие-то странные ограничения...
Bash
1
blkid /dev/sda3 -s UUID -o value
Цитата Сообщение от Hermod Посмотреть сообщение
Обьясните в чем ошибка?
Можно бороться с "жадностью"
Code
1
's/.*UUID=\"([^"]*)\".*/\1/'
Но гораздо проще
Code
1
's/.*UUID=\"//;s/\".*//'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2018, 15:58
Помогаю со студенческими работами здесь

Ещё раз о консоли
Никак не могу понять, в джаве А) можно ли выводить в консоль символы методом прямой записи в видеобуфер? В) рисовать в консоли? ...

Ещё раз о девушках
Всем добрый вечер. Раздел посвящён взаимоотношениям мужчин и женщин. Я хочу написать о другом, тема не вписывается в общую концепцию...

Ещё раз о скриншотах
Несколько дней назад форумчанен ПраПрапорщик поднимал эту тему, но закончилась она как-то не интересно. А тема, в принципе, очень...

Ещё раз о BIOS
Нужно было отформатировать жёсткий диск стационарного компьютера.Сделал всё с помощью Acronis Disk Director.Всё отформатировалось и...

Ещё раз о линкопомойниках
Стал сотрудничать с одной конторой не буду называть какой – оптимизаторы. b-( Посоветовали мне сделать линкосвалку из огромного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru