#1 17.02.2015 19:58:26

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

Мне стыдно, но затупил на пустом месте. Суть такова:
надо исключить пустые строки, строки из одних пробелов или строки, начинающиеся с # (строки с комментариями)

egrep -v '^[#\ ]\ *$'

- нуль эффекта (почему?)
egrep -v '^[#\ ]\ *'

- режет только комментарии
egrep -v '^#.*|^\ *$'

- работает, но выглядит страшно. Можно как-то адекватнее написать?

* про sed знаю если что, но спрашиваю вот про grep :)

#2 18.02.2015 06:44:07

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Да нормально выглядит, нечего тут сокращать.
Правда можно убрать экранирование пробела, поскольку ты одинарные кавычки используешь:

egrep -v '^#.*|^ *$'

#3 18.02.2015 06:56:11

bormant
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 2 265
IP-адрес

Сократить регулярку

grep -v '^\W*#\|^\W*$'

#4 18.02.2015 07:12:06

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Главное чтобы работало правильно и самому понятно было. А сокращать - уже дело последнее, придёт с опытом.

#5 18.02.2015 12:10:17

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

Ок, я уже понял, что без "|" нельзя написать, т. к. grep и шаблон исключения. Парсинг текстов на "естественных языках"- аццкое занятие! :)

#6 19.02.2015 05:46:25

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Обычно мучения с селом, а конвейер и греп сильно проще и понятнее.

#7 19.02.2015 05:46:25

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

1000Mhz, вы наверное не знаете, что у sed можно задать несколько команд через ";", и есть другие команды, кроме s.

У мучайтесь с конвейером grep, я за.

Quote by 1000Mhz
надо исключить пустые строки, строки из одних пробелов или строки, начинающиеся с # (строки с комментариями)

sed '/^\s*$/d; /^\s*#/d'

#8 19.02.2015 05:49:19

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by Vascom
Обычно мучения с селом, а конвейер и греп сильно проще и понятнее.
это называется: "write-only быдлокод". Поймите меня правильно, админу оно нормально, "написал-выполнил-ушёл дальше ИБД". Но ТС вроде какой-то скрипт пишет…

#9 19.02.2015 06:00:46

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Да я понимаю. Просто если надо изредка и по быстрому что-то сделать, то быдлокод проще и быстрее написать.

#10 19.02.2015 06:43:01

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by Vascom
Просто если надо изредка и по быстрому что-то сделать, то быдлокод проще и быстрее написать.

а знают-ли об этом новички, что вы им быдлокод советуете? Написанный "лишь-бы работало на моём локалхосте".

#11 19.02.2015 07:13:22

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Ну вроде я об этом предупредил.
Учащихся вождению автомобиля тоже не с болида F1 начинают.

#12 19.02.2015 08:38:19

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

Quote by drBatty
1000Mhz, вы наверное не знаете, что у sed можно задать несколько команд через ";"

Не знал. Зато знал, что можно задать несколько команд в виде -е команда1 -е команда2 ..
Quote by drBatty
и есть другие команды, кроме s

.. но их немного))


Тема была создана не потому, что я не знаю sed, а потому, что мне интересно, как это было сделать с grep. А почему? Потому что я сильно и от всей души не люблю sed за его гребаный частокол слешей! Вот drBatty считает это нормальным синтаксисом, а я- нет.

#13 19.02.2015 09:01:52

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Vascom, лично ну к вам вопросов у меня и нет.
разве что напомню:

In addition, the variant programs egrep and fgrep are the same as grep -E and grep -F, respectively. These variants are
deprecated, but are provided for backward compatibility.

#14 19.02.2015 09:04:16

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Это я тоже помню, но топикстартер явно не суперпереносимый универсальный скрипт делает, так что говорить про замену egrep на grep -E я не стал.

#15 19.02.2015 09:09:04

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by 1000Mhz
. но их немного))
достаточно для тьюринг-полноты.
Quote by 1000Mhz
Тема была создана не потому, что я не знаю sed, а потому, что мне интересно, как это было сделать с grep. А почему? Потому что я сильно и от всей души не люблю sed за его гребаный частокол слешей! Вот drBatty считает это нормальным синтаксисом, а я- нет.
есть разные задачи. К каждой задачи есть свой инструмент. В данном случае делать на grep — извращение. Grep изначально задумывалась для того, что-бы применить одну регулярку ко всему файлу и выдать результат.

Quote by Vascom
Это я тоже помню, но топикстартер явно не суперпереносимый универсальный скрипт делает, так что говорить про замену egrep на grep -E я не стал.
сложно было написать вместо
egrep -v

так:
grep -Ev

?

#16 19.02.2015 09:12:09

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Лучше бы вместо поучений просто дал этот совет коротко.

#17 19.02.2015 09:12:10

bormant
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 2 265
IP-адрес

Сократить регулярку

Да не нужен тут расширенный синтаксис grep, вполне достаточно стандартного:

grep -v '^\W*#\|^\W*$'

#18 19.02.2015 09:16:38

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

Quote by drBatty
В данном случае делать на grep — извращение.

В данном случае как раз нет, так как парсится всего лишь конфигурационный файл, это не_основная_логика.
По поводу egrep.. просто так привык и пока нет причин отвыкать.
Quote by bormant
Да не нужен тут расширенный синтаксис grep, вполне достаточно стандартного

Аналогично- просто некогда было анализировать, закатал по привычке. Но хуже не будет и по существу это ничего не меняет.

#19 19.02.2015 09:21:34

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by 1000Mhz
как раз нет, так как парсится всего лишь конфигурационный файл, это не_основная_логика.

не нужно врать, что, дескать, у вас "основная логика хорошая".

#20 19.02.2015 09:24:15

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Мне кажется тему надо закрывать, иначе в холивар превратится. Вопрос же решён.

#21 19.02.2015 09:29:06

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by Vascom
иначе в холивар превратится.
а что в этом плохого? Кто-то будет решать похожую проблему, наткнётся на эту тему, прочитает решение в начале. А холивар-т о чем мешает?

#22 19.02.2015 09:30:24

Vascom
Administrator
Зарегистрирован: 02.04.2010
Сообщений: 4 019
IP-адрес

Сократить регулярку

Холивар мешает порчей отношений между участниками.

#23 19.02.2015 09:34:46

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

да? ну ладно.

#24 19.02.2015 11:03:45

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

'^(#+.*)*\ *$'

не проверял, но "|" нет и sed`а нет.

#25 19.02.2015 11:19:29

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by 1000Mhz
'^(#+.*)*\ *$'
в sed это не работает, увы.

ЗЫЖ если речь про ведроид, то всякие {}|}{ там есть. Только закопаны глубоко.

#26 19.02.2015 11:29:12

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

А sed не регекспы использует, а свой тарабарский диалект :) (имхо)

#27 19.02.2015 12:31:58

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by 1000Mhz
А sed не регекспы использует, а свой тарабарский диалект

ниасилил? Ну так говори прямо, я, в детстве, тоже не знал.

#28 19.02.2015 14:55:52

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

Да не нужен тут sed, и даже если вы владеете им в совершенстве, то это не значит, что его нужно пихать в любую дырку.
"Когда в руках молоток, то все выглядит как гвоздь", а, drBatty?)) Да чо уж там, можно вообще awk заюзать :)

#29 19.02.2015 15:29:47

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Сократить регулярку

Quote by 1000Mhz
Да не нужен тут sed, и даже если вы владеете им в совершенстве, то это не значит, что его нужно пихать в любую дырку.
ну не sed, так grep. Я ими обоими владею совершенно одинаково. Дело совсем не в этом.

sed script можно запихать в файл
#/bin/sed -rf
/^\s*$/d
/^\s*#/d
и звать его одной командой
[console]$ remove_space.sed[/console]
это ИМХО лучше, чем каждый раз этот ужас вспоминать и набирать.
Quote by 1000Mhz
Да чо уж там, можно вообще awk заюзать

можно и на C++ программу написать, и это совсем не сложно, давеча в стандарт std::regex добавили.

#30 19.02.2015 15:44:41

1000Mhz
Administrator
Зарегистрирован: 17.08.2014
Сообщений: 816
IP-адрес

Сократить регулярку

Quote by drBatty
sed script можно запихать в файл

А то я не знаю! Раньше даже использовал свою подключаемую библиотеку функций
source functions.sh
но потом отказался от этой практики.

Board footer