<Попередній | зміст | Наступна>
Чергування
Перша з функцій розширеного регулярного виразу, яку ми обговоримо, називається чергування, що є інструментом, який дозволяє здійснювати збіг із набору виразів. Подібно до того, як вираз у дужках дозволяє знайти відповідність одному символу з набору вказаних символів, чергування дозволяє збіги з набору рядків або інших регулярних виразів.
Для демонстрації ми скористаємося GREP в поєднанні з нудьгувати. Спочатку давайте спробуємо звичайну стару відповідність рядка:
[me@linuxbox ~]$ луна "ААА" | grep AAA
AAA
[me@linuxbox ~]$ луна "ВВВ" | grep AAA
[me@linuxbox ~]$
[me@linuxbox ~]$ луна "ААА" | grep AAA
AAA
[me@linuxbox ~]$ луна "ВВВ" | grep AAA
[me@linuxbox ~]$
Досить простий приклад, у якому ми передаємо вихід нудьгувати в GREP і побачити результати. Коли відбувається збіг, ми бачимо його роздрукованим; коли не відбувається збігу, ми не бачимо результатів.
Тепер ми додамо чергування, позначене метасимволом вертикальної смуги:
[me@linuxbox ~]$ луна "ААА" | grep -E 'AAA|BBB'
AAA
[me@linuxbox ~]$ луна "ВВВ" | grep -E 'AAA|BBB'
BBB
[me@linuxbox ~]$ луна "CCC" | grep -E 'AAA|BBB'
[me@linuxbox ~]$
[me@linuxbox ~]$ луна "ААА" | grep -E 'AAA|BBB'
AAA
[me@linuxbox ~]$ луна "ВВВ" | grep -E 'AAA|BBB'
BBB
[me@linuxbox ~]$ луна "CCC" | grep -E 'AAA|BBB'
[me@linuxbox ~]$
Тут ми бачимо регулярний вираз 'AAA|BBB', що означає «відповідність рядку AAA або рядок BBB». Зауважте, що оскільки це розширена функція, ми додали -E варіант до GREP (хоча ми могли б просто використати егреп натомість програма), і ми взяли регулярний вираз у лапки, щоб оболонка не інтерпретувала метасимвол вертикальної смуги як оператор конвейера. Чергування не обмежується двома варіантами:
[me@linuxbox ~]$ луна "ААА" | grep -E 'AAA|BBB|CCC'
AAA
[me@linuxbox ~]$ луна "ААА" | grep -E 'AAA|BBB|CCC'
AAA
Щоб поєднати чергування з іншими елементами регулярного виразу, ми можемо використовувати (), щоб розділити чергування:
[me@linuxbox ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
[me@linuxbox ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
Цей вираз відповідатиме іменам файлів у наших списках, які починаються з «bz», «gz» або «zip». Якби ми виключили дужки, значення цього регулярного виразу:
[me@linuxbox ~]$ grep -Eh '^bz|gz|zip' dirlist*.txt
[me@linuxbox ~]$ grep -Eh '^bz|gz|zip' dirlist*.txt
зміни, щоб відповідати будь-якому імені файлу, яке починається з «bz» або містить "gz" або містить «блискавка».