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

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

В операційній системі 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): найпоширеніша серед різних мов програмування.
BREEREКлас символів POSIXPCRE
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
\Символ крнвеєру представляє значення "або".

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