Перейти до змісту

Регулярні вирази та символи підстановки

В операційній системі 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} і {a..z}

Різні команди мають різну підтримку стилів підстановки:

  • 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