Регулярні вирази та символи підстановки¶
В операційній системі GNU/Linux регулярні вирази та символи підстановки часто мають однаковий символ (або стиль), тому люди часто їх плутають.
Яка різниця між регулярними виразами та символами підстановки?
Подібності:
- Вони мають однаковий символ, але представляють абсолютно різні значення.
Відмінності:
- Регулярні вирази відповідають вмісту файлу; Символи підстановки зазвичай використовуються для відповідності імен файлів або каталогів.
- Регулярні вирази зазвичай використовуються в таких командах, як grep,sed,awkтощо.
- Символи підстановки зазвичай використовуються з такими командами, як cp,find,mv,touch,lsтощо.
Символи підстановки в GNU/Linux¶
ОС GNU/Linux підтримує такі символи підстановки:
| стиль символів підстановки | роль | 
|---|---|
| ? | Відповідає одному символу імені файлу або каталогу. | 
| - | Відповідає 0 або більше довільним символам імені файлу чи каталогу. | 
| [ ] | Збігається з будь-яким символом у круглих дужках. Наприклад, [один] що означає відповідність o, n або e. | 
| [-] | Збігається з будь-яким символом у вказаному діапазоні в дужках. Наприклад, [0-9] відповідає будь-якому окремому числу від 0 до 9. | 
| [^] | «логічне невідповідність» одного символу. Наприклад, [^a-zA-Z] представляє відповідність одному нелітерному символу. | 
| {,} | Неперервний збіг кількох окремих символів. Виділяється комами. | 
| {..} | Те саме, що [-]. Наприклад, {0..9} і | 
Різні команди мають різну підтримку стилів підстановки:
- find: Підтримує *, ?, [ ], [-], [^]
- ls: усі підтримуються
- mkdir: Підтримує {,} and {..}
- touch: Підтримує {,} and {..}
- mv: Всі підтримуються
- cp: Всі підтримуються
Наприклад:
Shell > mkdir -p /root/dir{1..3}
Shell > cd /root/dir1/
Shell > touch file{1,5,9}
Shell > cd 
Shell > mv /root/dir1/file[1-9]  /root/dir2/
Shell > cp /root/dir2/file{1..9} /root/dir3/
Shell > find / -iname "dir[1-9]" -a -type d
Регулярні вирази в GNU/Linux¶
Завдяки історичному розвитку існують дві основні школи регулярних виразів:
- POSIX:
- BRE(basic regular express)
- ERE(extend regular express)
- Клас символів POSIX
- PCRE (Regular Expressions, сумісні з Perl): найпоширеніша серед різних мов програмування.
| BRE | ERE | Клас символів POSIX | PCRE | |
|---|---|---|---|---|
| grep | √ | √ (Потрібна опція -E) | √ | √ (Потрібна опція -P) | 
| sed | √ | √ (Потрібна опція -r) | √ | × | 
| awk | √ | √ | √ | × | 
Щоб дізнатися більше про регулярні вирази, відвідайте цей веб-сайт, щоб отримати більше корисної інформації.
BRE¶
BRE (базовий регулярний вираз) — це найстаріший тип регулярного виразу, введений командою grep в системах UNIX і текстовому редакторі ed.
| метасимвол | опис | приклад bash | 
|---|---|---|
| - | Відповідає кількості повторень попереднього символу, яка може бути 0 або будь-якою кількістю разів. | |
| . | Відповідає будь-якому окремому символу, за винятком розривів рядків. | |
| ^ | Відповідає початку рядка. Наприклад, ^h відповідатиме рядкам, які починаються з h. | |
| $ | Збігається з кінцем рядка. Наприклад, h$ відповідатиме рядкам, які закінчуються на h. | |
| [] | Збігається з будь-яким символом, указаним у дужках. Наприклад - [who] відповідатиме w, h або o; [0-9] відповідатиме одній цифрі; [0-9][a-z] відповідатиме символам, які складаються з однієї цифри та однієї малої літери. | |
| [^] | Відповідає будь-якому окремому символу, крім символів у дужках. Наприклад, [^0-9] відповідатиме будь-якому нечисловому символу. [^a-z] відповідатиме будь-якому символу, який не є малою літерою. | |
| \ | Екранний символ скасовує значення, представлене деякими спеціальними символами. | echo -e "1.2\n122"  \\| grep -E '1\.2'1.2 | 
| \{n\} | Збігається з кількістю входжень попереднього одного символу, а n представляє кількість збігів. | echo -e "1994\n2000\n2222" \\| grep "[24]\{4\}"2222 | 
| \{n,\} | Збігається з попереднім єдиним символом принаймні n разів. | echo -e "1994\n2000\n2222" \\| grep  "[29]\{2,\}"1994 2222 | 
| \{n,m\} | Збігається з попереднім єдиним символом принаймні n і не більше m разів. | echo -e "abcd\n20\n300\n4444" \\| grep "[0-9]\{2,4\}"20 300 4444 | 
ERE¶
| метасимвол | опис | приклад bash | 
|---|---|---|
| - | Відповідає кількості входжень попереднього одного символу, який може бути один або кілька разів. | echo -e "abcd\nab\nabb\ncdd"  \\| grep -E "ab+"abcd ab abb | 
| ? | Збігається з кількістю входжень попереднього одного символу, який може бути 0 або 1. | echo -e  "ac\nabc\nadd" \\| grep -E 'a?c'ac abc | 
| \< | Граничний символ, який відповідає початку рядка. | echo -e "1\n12\n123\n1234" \\| grep -E "\<123"123 1234 | 
| \> | Граничний символ, що відповідає кінцю рядка. | echo -e "export\nimport\nout"  \\| grep -E "port\>"export import | 
| () | Комбінаторне зіставлення, тобто рядок у дужках як комбінація, а потім зіставлення. | echo -e "123abc\nabc123\na1b2c3" \\| grep -E "([a-z][0-9])+"abc123 a1b2c3 | 
| | | Символ крнвеєру представляє значення "або". | echo -e "port\nimport\nexport\none123" \\| grep -E "port\>\\|123"port import export one123 | 
ERE також підтримує символи зі спеціальними значеннями:
| спеціальні символи | опис | 
|---|---|
| \w | Еквівалент [a-zA-Z0-9] | 
| \W | Еквівалент [^a-zA-Z0-9] | 
| \d | Еквівалент [0-9] | 
| \D | Еквівалент [^0-9] | 
| \b | Еквівалент \< або \> | 
| \B | Відповідає символу без меж. | 
| \s | Відповідає будь-якому пробілу. Еквівалент [ \f\n\r\t\v] | 
| \S | Еквівалент [^ \f\n\r\t\v] | 
| порожній символ | опис | 
|---|---|
| \f | Відповідає одному символу каналу. Еквівалент \x0c і \cL | 
| \n | Збігається з окремими розривами рядків. Еквівалент \x0a і \cJ | 
| \r | Збігається з одним поверненням каретки. Еквівалент \x0d і \cM | 
| \t | Відповідає одній вкладці. Еквівалент \x09 і \cI | 
| \v | Відповідає одній вертикальній вкладці. Еквівалент \x0b і \cK | 
POSIX символ¶
Іноді ви можете побачити «символ POSIX» (також відомий як «клас символів POSIX»). Однак автор рідко використовує «символ POSIX», тому цей розділ лише для базового розуміння.
| POSIX символ | дорівнює | 
|---|---|
| [:alnum:] | [a-zA-Z0-9] | 
| [:alpha:] | [a-zA-Z] | 
| [:lower:] | [a-z] | 
| [:upper:] | [A-Z] | 
| [:digit:] | [0-9] | 
| [:space:] | [ \f\n\r\t\v] | 
| [:graph:] | [^ \f\n\r\t\v] | 
| [:blank:] | [ \t] | 
| [:cntrl:] | [\x00-\x1F\x7F] | 
| [:print:] | [\x20-\x7E] | 
| [:punct:] | [][!"#$%&'()*+,./:;<=>?@^_`{|}~-] | 
| [:xdigit:] | [A-Fa-f0-9] | 
Знайомство з регулярними виразами¶
Існує багато веб-сайтів для відпрацювання навичок регулярних виразів онлайн, наприклад:
Author: tianci li