Са терминалом: Коришћење регуларних израза

Једна од ствари коју сам увек волео на Линук терминалу је оно што можете постићи користећи регуларне изразе. Без обзира да ли треба да пронађемо компликовани текст или га заменимо нечим другим, употреба регуларних израза може у великој мери поједноставити посао. Почнимо од почетка:

УПОЗОРЕЊЕ: Овај пост мучи дупе. Стално читање овог поста може проузроковати губитак свести. Направите паузе између њих или питајте свог лекара или фармацеута пре него што прочитате цео пост.

Шта је регуларни израз?

Регуларни израз је низ посебних знакова који нам омогућавају да опишемо текст који желимо да пронађемо. На пример, ако бисмо желели да претражимо реч „линук“, било би довољно да ту реч ставимо у програм који користимо. Сама реч је редован израз. За сада се чини врло једноставно, али шта ако желимо да пронађемо све бројеве у одређеној датотеци? Или сви редови који почињу великим словом? У тим случајевима више не можете ставити једноставну реч. Решење је употреба регуларног израза.

Регуларни изрази у односу на обрасце датотека.

Пре него што пређемо на тему регуларних израза, желим да разјасним уобичајени неспоразум око регуларних израза. Регуларни израз није оно што стављамо као параметар у наредбе попут рм, цп итд. За упућивање на разне датотеке на чврстом диску. То би био образац датотеке. Регуларни изрази, иако слични по томе што користе неке уобичајене знакове, различити су. Узорак датотеке се активира према датотекама на тврдом диску и враћа оне који се у потпуности подударају са узорком, док се регуларни израз активира према тексту и враћа редове који садрже тражени текст. На пример, регуларни израз који одговара обрасцу *.* било би нешто слично ^.*\..*$

Врсте регуларних израза.

Не користе сви програми исте регуларне изразе. Не много мање. Постоји неколико више или мање стандардних типова регуларних израза, али постоје програми који незнатно мењају синтаксу, укључују сопствене екстензије или чак користе потпуно различите знакове. Стога, када желите да користите регуларне изразе са програмом који не познајете добро, прво треба погледати приручник или документацију програма да бисте видели какви су регуларни изрази које препознаје.

Прво, постоје две главне врсте регуларних израза које садржи ПОСИКС стандард, а то је оно што Линук алати користе. Они су основни и проширени регуларни изрази. Многе команде које раде са регуларним изразима, попут греп или сед, омогућавају вам да користите ове две врсте. О њима ћу говорити у наставку. Постоје и регуларни изрази у ПЕРЛ стилу, а затим постоје програми попут вим или емацс који користе њихове варијанте. У зависности од тога шта желимо да радимо, можда је прикладније користити једно или друго.

Тестирање регуларних израза.

Синтакса регуларних израза није ништа тривијално. Када морамо да напишемо компликовани регуларни израз, наћи ћемо се пред низом специјалних знакова које је на први поглед немогуће разумети, па је зато да бисмо научили како да их користимо неопходно имати начин да урадимо све тестове које желимо и да лако видимо резултате. Због тога ћу сада ставити неколико команди помоћу којих можемо да радимо тестове и експериментишемо све што нам треба док не доминирамо регуларним изразима.

Прва је греп наредба. Ово је наредба коју ћемо најчешће користити за претрагу. Синтакса је следећа:

grep [-E] 'REGEX' FICHERO
COMANDO | grep [-E] 'REGEX'

Препоручујем увек стављање регуларних израза у једноструке наводнике, тако да љуска не дође до тога. Први начин је проналажење регуларног израза у датотеци. Други омогућава филтрирање излаза наредбе кроз регуларни израз. Подразумевано греп користи основне регуларне изразе. Опција -Е је за употребу проширених регуларних израза.

Трик који нам може помоћи да видимо како функционишу регуларни изрази да би се омогућила употреба боје у наредби греп. На тај начин ће бити истакнут део текста који се подудара са регуларним изразом који користимо. Да бисте активирали боју у наредби греп, само уверите се да је променљива окружења GREP_OPTIONS садрже у вредности --color, што се може учинити овом наредбом:

GREP_OPTIONS=--color

Можемо га ставити у .басхрц да га увек активирамо.

Други начин употребе регуларних израза је коришћењем наредбе сед. Ово је погодније за замену текста, али се може користити и за претрагу. Синтакса за то би била овако:

sed -n[r] '/REGEX/p' FICHERO
COMANDO | sed -n[r] '/REGEX/p'

Команда сед такође подразумевано користи основне регуларне изразе, а можете користити проширене регуларне изразе са опцијом -р.

Још једна наредба коју такође желим да именујем је авк. Ова наредба се може користити за многе ствари, јер вам омогућава да пишете скрипте на свом програмском језику. Ако је оно што желимо пронаћи регуларни израз у датотеци или у излазу наредбе, начин на који бисмо га користили био би следећи:

awk '/REGEX/' FICHERO
COMANDO | awk '/REGEX/'

Ова наредба увек користи проширене регуларне изразе.

За наше тестове биће нам потребан и текст који ће послужити као пример за претрагу. Можемо користити следећи текст:

- Lista de páginas wiki:

ArchLinux: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/

- Fechas de lanzamiento:

Arch Linux: 11-03-2002
Gentoo: 31/03/2002
CentOs: 14-05-2004 03:32:38
Debian: 16/08/1993
Ubuntu: 20/10/2004

Desde Linux Rulez.

Ово је текст који ћу користити за примере остатка поста, па вам препоручујем да га копирате у датотеку да вам буде при руци са терминала. Можете ставити име које желите. Назвао сам га регуларним изразом.

Почетна лекција.

Сада имамо све што је потребно да започнемо тестирање регуларних израза. Идемо мало по мало. Навешћу неколико примера претраживања са регуларним изразима у којима ћу објаснити чему служи сваки лик. Нису баш добри примери, али пошто ћу имати врло дугачак пост, не желим то више да компликујем. И само ћу огребати површину онога што се може урадити регуларним изразима.

Најједноставније од свега је тражење одређене речи, на пример, претпоставимо да желимо да пронађемо све редове који садрже реч „Линук“. Ово је најлакше, јер морамо само да напишемо:

grep 'Linux' regex

И можемо видети резултат:

Сводлинук: хттпс://вики.арцхлинук.орг/ Арцх линук: 11-03-2002 Од линук Рулез.

Ово су три реда која садрже реч „Линук“ која ће, ако смо користили трик у боји, бити истакнута. Имајте на уму да препознаје реч коју тражимо чак и ако је део дуже речи као у „АрцхЛинук“. Међутим, не истиче реч „линук“ која се појављује у УРЛ-у „хттпс://вики.арцхлинук.орг/“. То је зато што се тамо појављује са малим словом „л“, а тражили смо га са великим словом. Команда греп има опције за ово, али нећу о њима да говорим у чланку о регуларним изразима.

Овим једноставним тестом можемо извући први закључак:

  • Нормалан лик стављен у регуларни израз поклапа се сам са собом.

Што ће рећи да ако ставите слово "а", тражиће слово "а". Изгледа логично, зар не? 🙂

Сада претпоставимо да желимо да претражимо реч „ЦентО“ иза које следи било који знак, али само један знак. За ово можемо користити знак „.“, Који је џокер знак који се подудара са било којим знаком, али само једним:

grep 'CentO.' regex

Резултат је:

Убунту: хттп://вики.центос.орг/
ЦентОс: 14-05-2004 03:32:38

Што значи да укључује „С“ у „ЦентОС“, иако је у једном случају велико, а у другом малом. Ако би се на том месту појавио било који други лик, такође би га укључио. Већ имамо друго правило:

  • Карактер "." одговара било којем лику.

Није више тако тривијално како се чинило, али са овим не можемо много учинити. Идемо мало даље. Претпоставимо да желимо да пронађемо редове у којима се појављују 2002. и 2004. Изгледају као две претраге, али могу се обавити одједном овако:

grep '200[24]' regex

Што значи да желимо да пронађемо број 200 иза којег следе 2 или 4. А резултат је следећи:

Арцх Линук: 11-03-2002
Гентоо: 31. /2002
ЦентОс: 14-05-2004 03:32:38
Ubuntu: 20/10/2004

Што нас доводи до трећег правила:

  • Вишеструки знакови затворени у заграде подударају се са било којим од знакова у заградама.

Заграде дају више игре. могу се користити и за изузеће знакова. На пример, претпоставимо да желимо да претражујемо локације на којима се појављује знак „:“, али га не прати „/“. Команда би била следећа:

grep ':[^/]' regex

Једноставно је ствар стављања „^“ као првог знака унутар заграде. Све жељене знакове можете ставити испод. Резултат ове последње наредбе је следећи:

АрцхЛинук: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/
Arch Linux: 11-03-2002 Гентоо: 31. ЦентОс: КСНУМКС-КСНУМКС-КСНУМКС КСНУМКС:32:38 Дебиан: 16 Убунту: 20/10/2004

Сада је иза имена дистро истакнуто „:“, али не и оне у УРЛ-овима, јер УРЛ-ови имају „/“ иза себе.

  • Стављање знака "^" на почетак заграде подудара се са било којим знаком осим са осталим знаковима у загради.

Друга ствар коју можемо да урадимо је да одредимо низ знакова. На пример, ако тражите било који број иза кога следи „-“, то би изгледало овако:

grep '[0-9]-' regex

Овим одређујемо знак између 0 и 9, а затим знак минус. Да видимо резултат:

Арцх Линук: 11-03-2002 ЦентОс: 14-05-КСНУМКС КСНУМКС: КСНУМКС: КСНУМКС

У заградама се може навести више опсега да би се опсези чак и помешали са појединачним знаковима.

  • Постављање два знака одвојена знаком „-“ у заградама подудара се са било којим знаком унутар опсега.

Погледајмо сада можемо ли да изаберемо први део УРЛ-ова. Она која каже „хттп“ или „хттпс“. Они се разликују само у последњим „с“, па учинимо то на следећи начин:

grep -E 'https?' regex

Знак питања се користи да би знак с леве стране био опционалан. Али сада смо команди додали опцију -Е. То је зато што је испитивање својство проширених регуларних израза. До сада смо користили основне регуларне изразе, тако да нисмо морали ништа да уносимо. Да видимо резултат:

АрцхЛинук: ХТТПС: //вики.арцхлинук.орг/ Гентоо: ХТТПС: //вики.гентоо.орг/вики/Маин_Паге ЦентОС: хттп: //вики.центос.орг/ Дебиан: ХТТПС: //вики.дебиан.орг/ Убунту: ХТТПС: //вики.убунту.цом/

Дакле, већ имамо ново правило:

  • Лик праћен знаком "?" одговара том лику или ниједном. Ово важи само за проширене регуларне изразе.

Сада ћемо потражити две потпуно различите речи. Погледајмо како пронаћи редове који садрже и реч „Дебиан“ и „Убунту“.

grep -E 'Debian|Ubuntu' regex

Помоћу вертикалне траке можемо раздвојити два или више различитих регуларних израза и пронаћи линије које се подударају са било којим од њих:

Дебиан: хттпс://вики.дебиан.орг/
убунту: хттпс://вики.убунту.цом/
Дебиан: КСНУМКС / КСНУМКС / КСНУМКС
убунту: КСНУМКС / КСНУМКС / КСНУМКС
  • Лик «|» служи за одвајање неколико регуларних израза и поклапања са било којим од њих. Такође је специфичан за проширене регуларне изразе.

Наставимо. Сада ћемо тражити реч „Линук“, али само тамо где није залепљена за неку другу реч с леве стране. Можемо то учинити овако:

grep '\

Овде је важан знак „<“, али треба избећи стављањем „\“ испред њега, тако да ће га греп протумачити као посебан знак. Резултат је следећи:

Свод линук: 11-03-2002 Од линук Рулез.

Такође можете да користите „\>“ да бисте тражили речи које нису тачно једна поред друге. Идемо са примером. Покушајмо са овом командом:

grep 'http\>' regex

Резултат који производи је следећи:

ЦентОС: хттп: //вики.центос.орг/

Изашао је „Хттп“, али не и „хттпс“, јер у „хттпс“ још увек постоји знак десно од „п“ који може бити део речи.

  • Знакови „<“ и „>“ се подударају с почетком и крајем речи. Ови знакови се морају избећи како се не би тумачили као дословни знакови.

Идемо са стварима мало компликованије. Знак „+“ одговара знаку с леве стране, поновљен најмање једном. Овај знак је доступан само са проширеним регуларним изразима. Помоћу ње можемо претраживати, на пример, секвенце од неколико бројева у низу који почињу са „:“.

grep -E ':[0-9]+' regex

Резултат:

ЦентОс: 14. 05: 32: 38

Број 38 је такође истакнут јер такође почиње са „:“.

  • Знак „+“ одговара знаку с леве стране, поновљен најмање једном.

Такође можете да контролишете број понављања помоћу „{“ и „}“. Идеја је ставити у заграде број који означава тачан број понављања која желимо. Такође можете ставити опсег. Погледајмо примере два случаја.

Прво ћемо пронаћи све четвороцифрене секвенце које постоје:

grep '[0-9]\{4\}' regex

Приметите да се коврчаве заграде морају избећи ако користимо основне регуларне изразе, али не и ако користимо проширене. Са продуженим би било овако:

grep -E '[0-9]{4}' regex

А резултат у оба случаја био би следећи:

Арцх Линук: 11-03-2002
Гентоо: 31. /2002
ЦентОс: 14-05-2004 03:32:38
Debian: 16/08/1993
Убунту: 20/10 /2004
  • Знакови "{" и "}" са бројем између њих подударају се са претходним знаком поновљеним наведеним бројем пута.

Сада други пример са заградама. Претпоставимо да желимо да пронађемо речи које имају између 3 и 6 малих слова. Могли бисмо да урадимо следеће:

grep '[a-z]\{3,6\}' regex

А резултат би био следећи:

- ЛИста de странаs вики: ДОрцхLинук: ХТТПС: //вики.арцхлинук.орг/ Гентоо: ХТТПС: //вики.гентоо.орг/вики/Mаин_Pстарост
CентОперативни систем: хттп: //вики.ЦентОС.орг/ Дебиан: ХТТПС: //вики.Дебиан.орг/ ИЛИбунту: ХТТПС: //вики.Убунту.com/ - Ф.ти недостајеш de издања: ДОрцх Lинук: 11-03-2002 Г.ентоо: 31 Ц.ентOs: 14-05-2004 03:32:38
Dебиан: 16 Убунту: 20 Д.То је Lинук Rулез.

Што, као што видите, не личи много на оно што смо желели. То је зато што регуларни израз проналази слова у другим речима које су дуже. Покушајмо са овом другом верзијом:

grep '\<[a-z]\{3,6\}\>' regex

Резултат:

- Списак страница вики: АрцхЛинук: ХТТПС: //вики.арцхлинук.орг/ Гентоо: ХТТПС: //вики.гентоо.орг/вики/ Маин_Паге ЦентОС: хттп: //вики.ЦентОС.орг/ Дебиан: ХТТПС: //вики.Дебиан.орг/ Убунту: ХТТПС: //вики.Убунту.com/

Ово већ више личи на оно што смо желели. Оно што смо урадили је да захтева да реч започне непосредно пре првог слова и заврши се непосредно након последњег.

  • Знакови „{“ и „}“ са два броја између њих одвојена зарезом подударају се са претходним знаком, поновљеним бројем пута означеним са два броја.

Погледајмо сада лик који је примерак „+“. То је "*" и његово деловање је врло слично само што се подудара са било којим бројем знакова, укључујући нулу. Односно, ради исто као и „+“, али не захтева да се знак с леве стране појави у тексту. На пример, покушајмо да потражимо оне адресе које почињу на вики-ју и завршавају на орг:

grep 'wiki.*org' regex

Да видимо резултат:

АрцхЛинук: хттпс: //вики.арцхлинук.орг/ Гентоо: хттпс: //вики.гентоо.орг/ вики / Маин_Паге ЦентОС: хттп: //вики.центос.орг/ Дебиан: хттпс: //вики.дебиан.орг/

Перфецто.

Сада последњи лик који ћемо видети. Знак „\“ користи се за избегавање знака с његове десне стране, тако да он губи своје посебно значење. На пример: Претпоставимо да желимо да лоцирамо линије које се завршавају тачком. Прво што би нам могло пасти на памет могло би бити следеће:

grep '.$' regex

Резултат није оно што тражимо:

- Листа вики страница:
АрцхЛинук: хттпс://вики.арцхлинук.орг/
Гентоо: хттпс://вики.гентоо.орг/вики/Маин_Пагe
ЦентОС: хттп://вики.центос.орг/
Дебиан: хттпс://вики.дебиан.орг/
Убунту: хттпс://вики.убунту.цом/
- Датуми издања: Арцх Линук: 11-03-2002
Гентоо: 312
CentOs: 14-05-2004 03:32:38
Дебиан: 163
Убунту: 204
Desde Linux Рулез.

То је зато што „.“ подудара се са било чим, тако да се регуларни израз подудара са последњим знаком сваког ретка какав год да је. Решење је следеће:

grep '\.$' regex

Сада је резултат оно што желимо:

Desde Linux Рулез.

Гаме овер

Иако је тема регуларних израза толико сложена да бих је дао за низ чланака, мислим да сам вам већ задао довољно бола. Ако сте успели да стигнете, честитам. А ако сте све ово прочитали у једном седишту, узмите аспирин или нешто слично, јер то не може бити добро.

За сада је то све. Ако вам се свиђа овај чланак, можда можете да напишете други. У међувремену, препоручујем вам да испробате све регуларне изразе у терминалу да бисте јасно видели како функционишу. И запамтите: Само Цхуцк Норрис може рашчланити ХТМЛ помоћу регуларних израза.


Оставите свој коментар

Ваша емаил адреса неће бити објављена. Обавезна поља су означена са *

*

*

  1. За податке одговоран: Мигуел Ангел Гатон
  2. Сврха података: Контрола нежељене поште, управљање коментарима.
  3. Легитимација: Ваш пристанак
  4. Комуникација података: Подаци се неће преносити трећим лицима, осим по законској обавези.
  5. Похрана података: База података коју хостује Оццентус Нетворкс (ЕУ)
  6. Права: У било ком тренутку можете ограничити, опоравити и избрисати своје податке.

  1.   Езекуиел дијо

    Какав би био наш живот без регуларног израза?
    Чланак је врло користан, али прочитаћу га мало по мало. Хвала пуно.

    1.    Хекборг дијо

      Хвала вам на коментару. Још увек не верујем да је изашао мој чланак. Изашло је са неком грешком, али надам се да је корисно. 🙂

  2.   Сцалибур дијо

    Хвала вамсссссссс! ..

    Пре извесног времена морао сам мало да учим о регуларним изразима .. ..Хвала вам што подучавате .. и детаљни водич да научим сваки од њих ..

    Врло добро! .. .. Идем по онај аспирин .. ее

    1.    Хекборг дијо

      Нема на чему. Храброст и да регуларни изрази не могу са вама. 🙂

  3.   Танрак дијо

    Фантастичан пост! Одличан посао. Питам се колико вам је сати требало 😀

    1.    Хекборг дијо

      ЛОЛ!! Питање је: Колико би ми сати требало да сам рекао све што сам намеравао да кажем? Инфините !! 🙂

  4.   таммуз дијо

    једно нисам знао, добар чланак!

    1.    Хекборг дијо

      Хвала вам. Задовољство је поделити са вама.

  5.   хелена_риуу дијо

    одлично објашњење. честитамо! заиста корисно!

    1.    Хекборг дијо

      Драго ми је што вам је било корисно. Тако да је задовољство писати.

  6.   против дијо

    Ово би требало ићи негде посебно. Свиђа вам се Истакнуто, али има врло специфичну корисност. Прилично корисно, мада бих волео да видим да се примењује на Вима.

    1.    Хекборг дијо

      То је питање постављања самог себе. Имам на уму још неколико чланака о регуларним изразима. И могао бих да причам о вим у њима. Има неке разлике од онога што сам објаснио у овом чланку. Ствар је у томе да се настави са тим. 🙂

  7.   Фернандо дијо

    Добро!

    Ваш чланак је јако добар, радознао је, недавно сам (управо сада) објавио на свом сајту унос који сам припремао неколико дана где сам прикупио листу метакарактера за регуларне изразе и неке примере. И било је поштено ући DesdeLinux и погледајте унос на исту тему!

    Ако је нека утеха, моја је МНОГО ВИШЕ ПУСНА 😀

    Свакако су регуларни изрази једна од најкориснијих ствари, обично их користим за обрезивање излаза наредби и задржавање дела који ме занима, а затим, на пример, у интеракцији с њим у басх скрипти. Такође сам их често користио на универзитету, и они су од виталног значаја за израду компајлера (у дефиницији лексикографских и рашчлањивача). Укратко, читав свет.

    Поздрав и врло врло добар посао.

    1.    Хекборг дијо

      Пуно Вам хвала.

      Свидео ми се и ваш чланак. Концизнији је од мог. Може послужити као брза референца. Случајно је да смо их писали истовремено. Можете видети да људе занима тема. 🙂

  8.   Еллери дијо

    Регуларни изрази за лутке =), сада ми је јасније, успут речено, један од начина да се добије излаз са бојом за греп је стварање псеудонима у .басхрц алиас греп = 'греп –цолор = алваис', у случају некоме успева.

    поздрави

    1.    Хекборг дијо

      Истина. То је још један начин да се то уради. Хвала на уносу. 🙂

  9.   КЗКГ ^ Гаара дијо

    О_О… прилог !!! О_О ...
    Пуно вам хвала на посту, неко време сам чекао тако нешто, ха, остављам га отвореним да га мирно читам код куће са нула гњаваже да се концентришем, хахаха.

    Хвала на чланку, заиста знам 😀

    1.    Хекборг дијо

      Знао сам да ће ти се свидети. ЛОЛ!! Истина је да многе ствари недостају, али већ имам на уму други део. 🙂

  10.   Елиецер Татес дијо

    Одличан чланак, да сам га прочитао јуче, час који сам данас одржао био би још лакши за моје ученике!

    1.    Хекборг дијо

      ЛОЛ!! Штета што сам закаснио, али драго ми је што је корисно. 🙂

  11.   ЛеоТоро дијо

    Напокон !!!, супер добар пост .... Напокон сам пронашао нешто што јасно објашњава регуларне изразе ... ..

    1.    Хекборг дијо

      Много је информација вани, али теже је пронаћи нешто што је лако разумљиво. Драго ми је што сам попунио ту празнину. 🙂

      Поздрав.

  12.   Шекспир Родос дијо

    Хеј, треба ми помоћ, морам да претражим / вар / логс у формату: ииммдд, а евиденције долазе као 130901.лог -130901.лог, морам да потражим све оне који су између 1. септембра и 11. октобра , Једино што сам успео је да уклоним цео септембар, али не знам како да урадим комплетан ланац:

    пр: 1309 [0-3] враћа ми записнике између 1. септембра и 30. септембра, али не знам како да уђем у исти ланац од 1. до 11. октобра.

    1.    Хекборг дијо

      Учинити то помоћу регуларних израза је мало компликовано. Пада ми на памет да би овако нешто могло успети:

      13(09[0-3]|10(0|1[01]))

      То је проширени регуларни израз. Не кажете који алат користите, тако да не могу да вам дам више детаља.

      У сваком случају, мислим да је то случај, уместо да се користе регуларни изрази, боље је то учинити помоћу финд-а. Можете пробати овако нешто:

      наћи. -невермт '01 сеп '-а! -невермт '11 окт '-принт

      Срећа. Надам се да вам ово може помоћи.

  13.   чипо дијо

    Здраво! Пре свега, желео сам да вам се захвалим на раду, јер се ова страница налази у мом „топ 3“ најбољих Линук сајтова.
    Вежбала сам и нисам знала зашто ми РегЕкп на телефонском броју није радио и било је то што ми је недостајало «-Е» (што сам схватио захваљујући овом посту).
    Желео сам да вас питам да ли не знате ниједан добар ПДФ или веб локацију на којој постоје вежбе на РегЕкп-у, мада уз мало маште можете и сами вежбати да их измишљате.

    Поздрав, Пабло.

  14.   Цали дијо

    Врло добро, управо сам прочитао све и да, сад ми треба аспирин 🙂

  15.   Осцар дијо

    Најбоље објашњење које сам видео за регуларне изразе. Захваљујем се аутору што је поделио ово дело.

    Поздрав.

  16.   Алекадер дијо

    Заиста ми се свидело врло добро објашњење