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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 44

Автор ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ Π‘Ρ€Π°ΠΉΠ°Π½ Уилсон

Π’ΠΎ всСх Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π²ΡˆΠΈΡ…ΡΡ Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… проводился поиск ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… строк ΠΈΠ· Π±ΡƒΠΊΠ² ΠΈ чисСл. Но ΠΊΠΎΠΌΠ°Π½Π΄Π°

grep
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ слоТныС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹: ΠΎΠ½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ выраТСния согласно простому языку для описания строк. Π‘ тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния шаблон прСдставляСт Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ спСцификаций строк, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Команда ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ рСгулярныС выраТСния, ΠΊΠ°ΠΊ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€
ed
. На самом Π΄Π΅Π»Π΅, эта ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Ρ‹Π»Π° создана (Π·Π° ΠΎΠ΄ΠΈΠ½ Π²Π΅Ρ‡Π΅Ρ€) прямым Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
ed
.

РСгулярныС выраТСния Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ряду символов, Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ

*
ΠΈ Ρ‚.ΠΏ., приписываСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ нСсколько мСтасимволов, Π½ΠΎ, ΠΊ соТалСнию, с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ значСниями. Π’ Ρ‚Π°Π±Π». 4.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ всС мСтасимволы рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΠΌΡ‹ ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΈΡ… здСсь рассмотрим.

с
Π›ΡŽΠ±ΠΎΠΉ Π½Π΅ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ символ c соотвСтствуСт самому сСбС
\c
Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ любоС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ символа
c
^
Начало строки
$
ΠšΠΎΠ½Π΅Ρ† строки
.
Π›ΡŽΠ±ΠΎΠΉ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ символ
[...]
Π›ΡŽΠ±ΠΎΠΉ символ ΠΈΠ·
...;
допустимы Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠ°
a-z
[^...]
Π›ΡŽΠ±ΠΎΠΉ символ Π½Π΅ ΠΈΠ·
...
; допустимы Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹
\n
Π‘Ρ‚Ρ€ΠΎΠΊΠ°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ n-ΠΌΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ
\(...\)
(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для
grep
)
r*
ΠΡƒΠ»ΡŒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ
r
r+
Одно ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ
r
(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для egrep)
r?
ΠΡƒΠ»ΡŒ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅
r
(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для egrep)
r1r2
Π—Π°
r1
слСдуСт
r2
r1|r2
r1
ΠΈΠ»ΠΈ
r2
(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для egrep)
\(r\)
ΠŸΠΎΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
r
(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для
grep
); ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ
(r)
РСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
r
(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ
для
grep); ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ
НикакоС рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ соотвСтствуСт ΠΊΠΎΠ½Ρ†Ρƒ строки

Π’Π°Π±Π»ΠΈΡ†Π° 4.1: РСгулярныС выраТСния

grep
ΠΈ
egrep
(Π² порядкС убывания ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°)

ΠœΠ΅Ρ‚Π°ΡΠΈΠΌΠ²ΠΎΠ»Ρ‹

^
ΠΈ
$
ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ шаблон ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ (
^
) ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ†Ρƒ (
$
) строки. НапримСр,

$ grep From $MAIL

ΠΈΡ‰Π΅Ρ‚ строки, содСрТащиС

From
Π² вашСй ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΉ посылкС, Π½ΠΎ

$ grep '^From' $MAIL

Π²Ρ‹Π΄Π°Π΅Ρ‚ строки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с

From
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, вСроятнСС всСго, Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ строками сообщСний. ΠœΠ΅Ρ‚Π°ΡΠΈΠΌΠ²ΠΎΠ»Ρ‹ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ с мСтасимволами ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, поэтому всСгда ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
grep
Π² апострофы.

Команда

grep
допускаСт классы символов, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ: Ρ‚Π°ΠΊ,
[a-z]
Π·Π°Π΄Π°Π΅Ρ‚ Π»ΡŽΠ±ΡƒΡŽ ΡΡ‚Ρ€ΠΎΡ‡Π½ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ. Но Π΅ΡΡ‚ΡŒ ΠΈ различия β€” Ссли класс символов ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
grep
начинаСтся с символа слабого ударСния Ρ‚ΠΎ шаблон Π·Π°Π΄Π°Π΅Ρ‚ любой символ, ΠΊΡ€ΠΎΠΌΠ΅ входящих Π² Π΄Π°Π½Π½Ρ‹ΠΉ класс. Π—Π½Π°Ρ‡ΠΈΡ‚,
[^0-9]
Π·Π°Π΄Π°Π΅Ρ‚ любой символ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ†ΠΈΡ„Ρ€Ρ‹. Как ΠΈ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅, обратная дробная Ρ‡Π΅Ρ€Ρ‚Π° экранируСт символы
]
ΠΈ
-
Π² классС символов, Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
grep
ΠΈ
ed
Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти символы использовались Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСдвусмыслСнно. НапримСр, шаблон
[][-]
Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΡƒΡŽ скобку Π»ΠΈΠ±ΠΎ Π·Π½Π°ΠΊ минус.

Π’ΠΎΡ‡ΠΊΠ°

'.'
эквивалСнтна
'?'
Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅: ΠΎΠ½Π° Π·Π°Π΄Π°Π΅Ρ‚ любой символ. (Π’ΠΎΡ‡ΠΊΠ°, ΠΏΠΎ всСй видимости, Π΅ΡΡ‚ΡŒ символ, Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.) НиТС приводятся Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

$ ls -l | grep '^d'Β Β Β Β Β Β Β Β 
Бписок ΠΈΠΌΠ΅Π½ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

$ ls -l | grep '^.......rw'
Бписок Ρ„Π°ΠΉΠ»ΠΎΠ², доступных всСм для чтСния ΠΈ записи

Π‘ΠΈΠΌΠ²ΠΎΠ»

'^'
ΠΈ сСмь Ρ‚ΠΎΡ‡Π΅ΠΊ Π·Π°Π΄Π°ΡŽΡ‚ Π»ΡŽΠ±Ρ‹Π΅ сСмь символов Π² Π½Π°Ρ‡Π°Π»Π΅ строки; Π² случаС примСнСния ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
ls -l
задаСтся любая строка ΠΏΡ€Π°Π²Π° доступа.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ "ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒ" (

'*'
) ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΊ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡŽΡ‰Π΅ΠΌΡƒ Π΅Π΅ символу ΠΈΠ»ΠΈ мСтасимволу (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ класс символов), ΠΈ вмСстС ΠΎΠ½ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ любоС число Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ символа ΠΈΠ»ΠΈ мСтасимвола. НапримСр,
x*
Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠΊΠ²
x
ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹,
[a-zA-Z]*
β€” Π»ΡŽΠ±ΡƒΡŽ строку Π±ΡƒΠΊΠ²,
.*
β€” всС Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки, Π°
.*x
β€” всС Π΄ΠΎ послСднСго символа
x
Π² строкС Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. НСобходимо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², связанных с ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Π»Π΅ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒ дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ символ, поэтому
xy*
соотвСтствуСт
x
, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΈΠ΄ΡƒΡ‚
yy...
, Π½ΠΎ Π½Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚ΠΈΠΏΠ°
xyxyxy
. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, любоС число Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½ΡƒΠ»ΡŒ, поэтому Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ символ присутствовал, Π² шаблонС Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ. НапримСр, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΌ строку Π±ΡƒΠΊΠ², являСтся Ρ‚Π°ΠΊΠΎΠ΅:
[a-zA-Z][a-zA-Z]*
(Π±ΡƒΠΊΠ²Π°, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт Π½ΡƒΠ»ΡŒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π±ΡƒΠΊΠ²). РСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
.*
соотвСтствуСт β€”
*
, Ρ‚.Π΅. мСтасимволу ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ для ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ².