Чи шукаєте ви за допомогою Grep або шукаєте програми, які можуть перейменувати файли для вас, ви, ймовірно, задаєтеся питанням, чи існує більш простий спосіб виконати свою роботу. На щастя, є, і це називається «формальні вирази».
(Комікс від XKCD.com)
Що таке формальні вирази?
Формальні вирази - це оператори, відформатовані дуже специфічним способом, які можуть означати багато різних результатів. Також відомі як «regex» або «regexp», вони в основному використовуються у функціях пошуку та іменування файлів. Один формальний вираз може використовуватися як формула для створення низки можливих вихідних даних, всі з яких шукаються. Крім того, ви можете вказати, як слід називати групу файлів, вказавши формальний вираз, і ваше програмне забезпечення може поступово переходити до наступного передбачуваного висновку. Таким чином, ви можете дуже легко і ефективно перейменувати кілька файлів у декількох теках і вийти за межі простої системи нумерації.
Оскільки використання формальних виразів ґрунтується на спеціальному синтаксисі, ваша програма повинна бути здатна їх читати і аналізувати. Багато програм пакетного перейменування файлів для Windows і OS X мають підтримку регулярних виразів, а також інструмент кроссплатформного пошуку GREP (про який ми говорили в керівництві Bash Scripting для початківців) і інструмент командного рядка Awk для * Nix. Крім того, багато альтернативних файлових менеджерів, засоби запуску та інструменти пошуку використовують їх, і вони займають дуже важливе місце в таких мовах програмування, як Perl і Ruby. Інші середовища розробки, такі як. NET, Java і Python, а також прийдешній C++ 11, надають стандартні бібліотеки для використання регулярних виразів. Як ви можете собі уявити, вони можуть бути дуже корисні при спробі мінімізувати обсяг коду, який ви поміщаєте в програму.
Примітка про втечу персонажів
Перш ніж ми покажемо вам приклади, ми б хотіли дещо відзначити. Ми збираємося використовувати оболонку bash і команду grep, щоб показати вам, як застосовувати формальні вирази. Проблема в тому, що іноді ми хочемо використовувати спеціальні символи, які необхідно передати в grep, і оболонка bash буде інтерпретувати цей символ, тому що оболонка також використовує його. За цих обставин нам потрібно «втекти» від цих персонажів. Це може збити з пантелику, тому що це «екранування» символів також відбувається всередині регулярних виразів. Наприклад, якщо ми хочемо ввести це в grep:
\ <
ми повинні замінити це на:
\\\ <
Кожен спеціальний символ тут отримує одну зворотну косу межу. Крім того, ви також можете використовувати одинарні лапки:
‘\ <‘
Одиночні лапки кажуть bash НЕ інтерпретувати, що всередині них. Хоча ми вимагаємо, щоб ці кроки були зроблені, щоб ми могли продемонструвати для вас, ваші програми (особливо програми на основі графічного інтерфейсу) часто не вимагають цих додаткових кроків. Для простоти і зрозумілості фактичний формальний вираз буде надано у вигляді тексту в лапках, і ви побачите екранований синтаксис на знімках екрану командного рядка.
Як вони розширюються?
Формальні вирази - це дійсно лаконічний спосіб визначення термінів, щоб ваш комп'ютер міг розширити їх на кілька варіантів. Давайте подивимося на наступний приклад:
Том [0123456789]
Квадратні дужки - [і] - повідомляють механізму синтаксичного аналізу, що все, що знаходиться всередині, може використовуватися будь-який ОДИН символ. Все, що знаходиться всередині цих дужок, називається набором символів.
Отже, якби у нас був величезний список записів, і ми використовували цей формальний вираз для пошуку, були б знайдені наступні терміни:
- Том
- tom0
- tom1
- том2
- том3
і так далі. Однак наступний список не буде відповідати, і тому не буде відображатися у ваших результатах:
- помідор; формальний вираз не враховує жодних літер після «Том»
- Том; формальний вираз чутливий до регістру!
Ви також можете вибрати пошук з точкою (.), яка дозволить будь-якому присутньому символу бути присутнім, поки він присутній.
Як ви можете бачити,
.Том
не наводив термінів, які мали тільки «том» на початку. Увійшли навіть «зелені помідори», тому що пробіл перед «том» вважається символом, але такі терміни, як «томФ», не мали символу на початку і тому ігнорувалися.
Примітка. За замовчуванням Grep повертає цілий рядок тексту, коли якась частина відповідає вашому формальному виразу. Інші програми можуть цього не робити, і ви можете відключити це в grep з прапором «-o».
Ви також можете вказати чергування, використовуючи трубу (|), як тут:
Speciali (s | г) ^
Це знайде обидва:
- спеціалізуватися
- спеціалізуватися
При використанні команди grep нам потрібно екранувати спеціальні символи (, |, і) зі зворотною косою рисою, а також використовувати прапор «-E», щоб змусити це працювати і уникнути потворних помилок.
Як ми згадували вище, це пов'язано з тим, що ми повинні вказати оболонці bash передати ці символи в grep і нічого не робити з ними. Прапор «-E» вказує grep використовувати круглі дужки і трубу як спеціальні символи.
Ви можете шукати за винятком, використовуючи каретку, яка знаходиться як всередині ваших квадратних дужок, так і на початку набору:
Том [^ F | 0-9]
Знову ж таки, якщо ви використовуєте grep і bash, не забудьте вийти з цієї труби!
Терміни, які були у списку, але не відображалися:
- tom0
- tom5
- tom9
- tomF
Це не відповідає нашому формальному виразу.
Як я можу використовувати навколишнє середовище?
Часто ми шукаємо на основі кордонів. Іноді нам потрібні тільки рядки, які з'являються на початку слова, в кінці слова або в кінці рядка коду. Це можна легко зробити, використовуючи те, що ми називаємо якорями.
Використання каретки (поза дужками) дозволяє позначити «початок» рядка.
- Тому
Для пошуку кінця рядка використовуйте знак долара.
том $
Ви можете бачити, що наш рядок пошуку приходить ДО прив'язки в цьому випадку.
Крім того, ви можете налаштувати співпади, які з "являються на початку або кінці слів, а не цілі рядки.
\ < Том
Том\>
Як ми згадували в примітці на початку цієї статті, нам потрібно екранувати ці спеціальні символи, тому що ми використовуємо bash. Крім того, ви також можете використовувати одинарні лапки:
Результати однакові. Переконайтеся, що ви використовуєте одинарні лапки, а не подвійні.
Інші ресурси для формальних виразів
Ми тільки досягли вершини айсберга тут. Ви також можете шукати грошові терміни, позначені маркером валюти, і шукати будь-яке з трьох або більше відповідних термінів. Речі можуть стати дійсно складними. Якщо ви бажаєте дізнатися більше про формальні вирази, зверніть увагу на такі джерела:
- com має кілька сторінок з конкретними прикладами того, чому речі не збігаються.
- У Regular-Expressions.info також є довідник з багатьох більш складних речей, а також зручна довідкова сторінка.
- org має сторінку, присвячену використанню формальних виразів з grep.
Ви також можете створювати і тестувати свої регулярні вирази за допомогою безкоштовного онлайн-інструменту на основі Flash, який називається RegExr. Він працює при введенні тексту, є безкоштовним і може використовуватися в більшості браузерів.
У вас є улюблене використання формальних виразів? Знаєш відмінний перейменувальник, який їх використовує? Можливо, ви просто хочете похвалитися своїм грефу. Поділіться своїми думками, коментуючи!
