Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Командная строка Linux. ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 52

Автор Уильям Шоттс

Π’ сСрСдинС 1980-Ρ… институт ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² элСктроники ΠΈ элСктротСхники (Institute of Electrical and Electronics Engineers, IEEE) Π½Π°Ρ‡Π°Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° стандартов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ особСнности Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмы Unix (ΠΈ Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ…). Π­Ρ‚ΠΈ стандарты, Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ извСстныС ΠΊΠ°ΠΊ IEEE 1003, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ интСрфСйсы (Application Programming Interface, API), ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² стандартной Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ систСмС. НазваниС POSIX, сокращСнноС ΠΎΡ‚ Β«Portable Operating System InterfaceΒ» (интСрфСйс пСрСносимой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Π³Π΄Π΅ Π±ΡƒΠΊΠ²Π° X Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ звучания), Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π ΠΈΡ‡Π°Ρ€Π΄ΠΎΠΌ Π‘Ρ‚ΠΎΠ»Π»ΠΌΠ°Π½ΠΎΠΌ (Π΄Π°, Ρ‚Π΅ΠΌ самым Π ΠΈΡ‡Π°Ρ€Π΄ΠΎΠΌ Π‘Ρ‚ΠΎΠ»Π»ΠΌΠ°Π½ΠΎΠΌ) β€” ΠΈ принято IEEE.

Π§Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅


ΠŸΠ΅Ρ€Π²ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ обсудим, Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ (alternation, ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€Π°) β€” ΠΎΠ½ΠΎ позволяСт Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ совпадСниС с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ выраТСния Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠΌΡƒ символу ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ мноТСству ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… символов, Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ совпадСниС с мноТСством строк ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Для дСмонстрации Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ grep ΠΈ echo. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ простоС сопоставлСниС строк:

[ [email protected] ~]$ echo "AAA" | grep AAA

AAA

[ [email protected] ~]$ echo "BBB" | grep AAA

[ [email protected] ~]$

Достаточно простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ echo Π½Π° Π²Π²ΠΎΠ΄ grep ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Если обнаруТиваСтся совпадСниС, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π²Ρ‹Π²ΠΎΠ΄; Ссли совпадСниС отсутствуСт, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ выводится.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅ΠΌΠΎΠ΅ мСтасимволом Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚Ρ‹:

[ [email protected] ~]$ echo "AAA" | grep -E 'AAA|BBB'

AAA

[ [email protected] ~]$ echo "BBB" | grep -E 'AAA|BBB'

BBB

[ [email protected] ~]$ echo "CCC" | grep -E 'AAA|BBB'

[ [email protected] ~]$

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 'AAA|BBB', ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «совпадСниС со строкой AAA ΠΈΠ»ΠΈ со строкой BBBΒ». Π’Π°ΠΊ ΠΊΠ°ΠΊ это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ, ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ grep ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -E (вмСсто этого ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ egrep) ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ символа Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°. Π’ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²:

[ [email protected] ~]$ echo "AAA" | grep -E 'AAA|BBB|CCC'

AAA

Для объСдинСния с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ элСмСнтами рСгулярного выраТСния Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки ():

[ [email protected] ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt

Π­Ρ‚ΠΎΠΌΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· Π½Π°ΡˆΠΈΡ… списков, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с bz, gz ΠΈΠ»ΠΈ zip. Если ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, смысл рСгулярного выраТСния измСнится, ΠΈ Π΅ΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π°, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с bz ΠΈΠ»ΠΈ содСрТащиС gz ΠΈΠ»ΠΈ zip:

[ [email protected] ~]$ grep -Eh '^bz|gz|zip' dirlist*.txt

ΠšΠ²Π°Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹


Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ рСгулярныС выраТСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ нСсколько способов опрСдСлСния числа совпадСний с элСмСнтом.

? β€” совпадСниС с элСмСнтом ноль ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·


Π­Ρ‚ΠΎΡ‚ ΠΊΠ²Π°Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ фактичСски ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: «совпадСниС с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ элСмСнтом Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΒ». ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°, ΠΈ прСдполагаСтся, Ρ‡Ρ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€ допустим, Ссли прСдставлСн Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„ΠΎΡ€ΠΌ: (nnn) nnn-nnnn ΠΈΠ»ΠΈ nnn nnn-nnnn, Π³Π΄Π΅ n β€” это Ρ†ΠΈΡ„Ρ€Π°. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

Π’ этом Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π·Π° ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π·Π½Π°ΠΊΠΈ вопроса, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅, Ρ‡Ρ‚ΠΎ скобки ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. И снова, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ мСтасимволами (Π² ERE), ΠΌΡ‹ экранировали ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ слСшами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

[ [email protected] ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]$'

(555) 123-4567

[ [email protected] ~]$ echo "555 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'

555 123-4567

[ [email protected] ~]$ echo "AAA 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'

[ [email protected] ~]$

Π—Π΄Π΅ΡΡŒ рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ записи Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°, Π½ΠΎ Π΅ΠΌΡƒ Π½Π΅ соотвСтствуСт Π½ΠΎΠΌΠ΅Ρ€, содСрТащий Π½Π΅Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ символы.

* β€” совпадСниС с элСмСнтом ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·


Подобно мСтасимволу ?, Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ° (*) ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт; ΠΎΠ΄Π½Π°ΠΊΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π·Π½Π°ΠΊΠ° вопроса (?), этот элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ любоС число Ρ€Π°Π·, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ строка ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ нашим трСбованиям строка Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с большой Π±ΡƒΠΊΠ²Ρ‹, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ любоС число Π±ΡƒΠΊΠ² Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ рСгистра ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. Для поиска совпадСний с этим (ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ прСдлоТСния Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ:

[[:upper:]][[:upper:][:lower:] ]*\.

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… элСмСнтов: Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках с классом символов [:upper:], Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках с двумя классами символов, [:upper:] ΠΈ [:lower:], ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ, ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°, экранированная ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ слСшСм. Π’Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт сопровоТдаСтся мСтасимволом *, поэтому Π² нашСм ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ любоС число Π±ΡƒΠΊΠ² Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ рСгистра ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра:

[ [email protected] ~]$ echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

This works.

[ [email protected] ~]$ echo "This Works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

This Works.

[ [email protected] ~]$ echo "this does not" | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

[ [email protected] ~]$

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ, Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ β€” Π½Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ отсутствуСт ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°.

+ β€” совпадСниС с элСмСнтом ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·


ΠœΠ΅Ρ‚Π°ΡΠΈΠΌΠ²ΠΎΠ» + дСйствуСт ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ *, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ совпадСния с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ элСмСнтом Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строки, состоящиС ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏ, Π½Π°ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½Ρ‹Ρ… символов ΠΈ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ:

^([[:alpha:]]+ ?)+$

ΠžΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Π³ΠΎ:

[ [email protected] ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'

This that

[ [email protected] ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'

a b c

[ [email protected] ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'

[ [email protected] ~]$ echo "abc d" | grep -E '^([[:alpha:]]+ ?)+$'

[ [email protected] ~]$

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, этому Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π½Π΅ соотвСтствуСт строка "a b 9", ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° содСрТит Π½Π΅Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½Ρ‹ΠΉ символ; Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π΅ΠΌΡƒ Π½Π΅ соотвСтствуСт строка "abc d", ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ символами c ΠΈ d Π² Π½Π΅ΠΉ присутствуСт большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»Π°.

{ } β€” совпадСниС с элСмСнтом ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ число Ρ€Π°Π·


ΠœΠ΅Ρ‚Π°ΡΠΈΠΌΠ²ΠΎΠ»Ρ‹ { ΠΈ } ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ минимальноС ΠΈ максимальноС число ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… совпадСний. Π­Ρ‚ΠΈ числа ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ способами, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π». 19.3.

Π’Π°Π±Π»ΠΈΡ†Π° 19.3. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ числа совпадСний

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

{n}

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ элСмСнт соотвСтствуСт, Ссли встрСчаСтся Ρ‚ΠΎΡ‡Π½ΠΎ n Ρ€Π°Π·

{n,m}

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ элСмСнт соотвСтствуСт, Ссли встрСчаСтся Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ n ΠΈ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ m Ρ€Π°Π·

{n,}

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ элСмСнт соотвСтствуСт, Ссли встрСчаСтся n ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·

{,m}

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ элСмСнт соотвСтствуСт, Ссли встрСчаСтся Π½Π΅ Π±ΠΎΠ»Π΅Π΅ m Ρ€Π°Π·


Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½Ρ‹ΠΌΠΈ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ, ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ этим ΠΌΠ΅Β­Ρ‚ΠΎΠ΄ΠΎΠΌ опрСдСлСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ исходноС рСгулярноС Π²Ρ‹Ρ€Π°Β­ΠΆΠ΅Π½ΠΈΠ΅

^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

Π΄ΠΎ

^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$

ΠžΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Π³ΠΎ:

[ [email protected] ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-

[0-9]{4}$'

(555) 123-4567

[ [email protected] ~]$ echo "555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'

555 123-4567

[ [email protected] ~]$ echo "5555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-

[0-9]{4}$'

[ [email protected] ~]$

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, измСнСнная вСрсия рСгулярного выраТСния ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ справляСтся с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ², с ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками ΠΈ Π±Π΅Π· Π½ΠΈΡ…, ΠΈ ΠΎΡ‚Π²Π΅Ρ€Π³Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹Π΅ Π½ΠΎΠΌΠ΅Ρ€Π°.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ


Рассмотрим нСсколько ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ посмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ рСгулярныС выраТСния.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° списка Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ grep


Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π±Ρ€Π°Π»ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½Ρ‹Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ провСряли ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΡ… оформлСния. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΆΠ΅ часто приходится ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ списки Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ², поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим Ρ‚Π°ΠΊΠΎΠΉ список. Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ волшСбной ΠΌΠ°Π³ΠΈΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. МагиСй, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ, Π½ΠΎ Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ β€” ΠΌΡ‹ рассмотрим ΠΈΡ… Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ…. Π’ΠΎΡ‚ это Π²ΠΎΠ»ΡˆΠ΅Π±ΡΡ‚Π²ΠΎ:

[ [email protected] ~]$ for i in {1..10}; do echo "(${RANDOM:0:3}) ${RANDOM:0:3}-${RANDOM:0:4}" >> phonelist.txt; done

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° создаст Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ phonelist.txt, содСрТащий 10 Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½Ρ‹Ρ… Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ². Если ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΎΠ½Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π² список Π΅Ρ‰Π΅ 10 Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ². Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ число 10 Π±Π»ΠΈΠΆΠ΅ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ большС ΠΈΠ»ΠΈ мСньшС Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ². Однако Ссли Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ», ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ:

[ [email protected] ~]$ cat phonelist.txt

(232) 298-2265

(624) 381-1078

(540) 126-1980

(874) 163-2885

(286) 254-2860

(292) 108-518

(129) 44-1379