Регулярні вирази та символи підстановки¶
В операційній системі 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