Ярослав Крутиков - преподаватель Lviv Code School в Одессе.
20 июля рассказал:
- Почему именно Ruby?
(отличия от других языков и явные преимущества).
- Особенные фичи или почему Ruby - это язык счастливых людей?
Многие из Вас спрашивали, где можно подробнее почитать о курсе: http://bit.ly/29DBAL4
Иван Стеценко: ЯП Zephir. Панацея или лечение?Oleg Poludnenko
Доклад с PUG#6 https://www.facebook.com/events/837043689707114/
Поговорим о:
- сути интерпретируемого PHP, обсудим, как с этим жить;
- панацее Zephir. «А что там под капотом?»;
- наглядном профите. Поиграем с Symfony, Yii, Magento;
- будущем Zephir.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
Ярослав Крутиков - преподаватель Lviv Code School в Одессе.
20 июля рассказал:
- Почему именно Ruby?
(отличия от других языков и явные преимущества).
- Особенные фичи или почему Ruby - это язык счастливых людей?
Многие из Вас спрашивали, где можно подробнее почитать о курсе: http://bit.ly/29DBAL4
Иван Стеценко: ЯП Zephir. Панацея или лечение?Oleg Poludnenko
Доклад с PUG#6 https://www.facebook.com/events/837043689707114/
Поговорим о:
- сути интерпретируемого PHP, обсудим, как с этим жить;
- панацее Zephir. «А что там под капотом?»;
- наглядном профите. Поиграем с Symfony, Yii, Magento;
- будущем Zephir.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"PyNSK
Докладчик:
Александр Маршалов (ЦФТ)
Описание: Мы узнаем, что из себя представляет дерево синтаксического разбора (AST / Abstract Syntax Tree) в языке Python
и какие магические возможности можно получить с помощью модификации AST.
Универсальный сигнатурный анализ кода на C#, Java, PHPИван Кочуркин
В данном докладе затронуты такие темы, как теория и проблемы парсинга, построение и обход абстрактных синтаксических деревьев (AST) и разработка предметно-ориентированного языка (DSL).
Рассматриваются такие проблемы парсинга, как разбор контекстно-зависимых языков, обработка ошибок и др. В качестве примера применения теории приведена грамматика PHP, разработанная для генератора парсеров ANTLR.
Далее рассматриваются структура унифицированного AST, методы его обхода и сопоставления с паттернами.
Завершающей частью презентации является описание DSL, разработанного с целью записи существующих и будущих паттернов. Также приведены примеры некоторых паттернов для лучшей усвояемости материала.
язык работы с КМАС (Yafoll сообщение 1)Alex Shkotin
Вводится понятие конечной многоосновной алгебраической системы (КМАС/FMAS), а также язык для работы с такими системами - YAFOLL (Yet Another First Order Logic Language).
Показывается применимость таких систем для построения математической модели части реальности, т.е. математической конструкции к которой можно обращаться с вопросами о свойствах объектов и процессов предметной области.
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
Python AST: между исходным текстом и байт-кодом / Николай Карелин / Системный архитектор VPI Development Center
Николай познакомит слушателей с деталями устройства Python AST и, в частности, расскажет некоторые интересные факты о работе диалекта Hy.
Python Meetup - встречи минского сообщества любителей языка программирования Python.
Присоединяйся к нам!
Мы в twitter: https://twitter.com/pythonminsk
Мы на youtube: http://www.youtube.com/pythonMinsk
Мы на slideshare: http://www.slideshare.net/MinskPythonMeetup
This document discusses the React application lifecycle and component lifecycle methods. It explains the different phases a React component goes through:
1. Mounting/Birth which includes initialization, getting default props/state, componentWillMount, render(), and componentDidMount.
2. Updating/Growth which involves receiving new props, re-rendering if needed, componentWillUpdate, render(), componentDidUpdate.
3. Unmounting/Death includes cleanup with componentWillUnmount before the component is removed from the DOM.
It provides code examples for using state, props, lifecycle methods, and testing React components with Jest and snapshots.
#13 "Управление состоянием в Redux" Роман СальниковJSib
Один из трендов в разработке приложений на JavaScript - разделение состояния и отображения. В докладе речь пойдет о том, как мы применили для этих целей библиотеку Redux. Расскажу, больно ли ломать мозг новым подходом (спойлер: да), обязательно ли писать все на React (спойлер: нет), стало ли легче разрабатывать и тестировать (спойлер: вы не поверите).
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"PyNSK
Докладчик:
Александр Маршалов (ЦФТ)
Описание: Мы узнаем, что из себя представляет дерево синтаксического разбора (AST / Abstract Syntax Tree) в языке Python
и какие магические возможности можно получить с помощью модификации AST.
Универсальный сигнатурный анализ кода на C#, Java, PHPИван Кочуркин
В данном докладе затронуты такие темы, как теория и проблемы парсинга, построение и обход абстрактных синтаксических деревьев (AST) и разработка предметно-ориентированного языка (DSL).
Рассматриваются такие проблемы парсинга, как разбор контекстно-зависимых языков, обработка ошибок и др. В качестве примера применения теории приведена грамматика PHP, разработанная для генератора парсеров ANTLR.
Далее рассматриваются структура унифицированного AST, методы его обхода и сопоставления с паттернами.
Завершающей частью презентации является описание DSL, разработанного с целью записи существующих и будущих паттернов. Также приведены примеры некоторых паттернов для лучшей усвояемости материала.
язык работы с КМАС (Yafoll сообщение 1)Alex Shkotin
Вводится понятие конечной многоосновной алгебраической системы (КМАС/FMAS), а также язык для работы с такими системами - YAFOLL (Yet Another First Order Logic Language).
Показывается применимость таких систем для построения математической модели части реальности, т.е. математической конструкции к которой можно обращаться с вопросами о свойствах объектов и процессов предметной области.
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
Python AST: между исходным текстом и байт-кодом / Николай Карелин / Системный архитектор VPI Development Center
Николай познакомит слушателей с деталями устройства Python AST и, в частности, расскажет некоторые интересные факты о работе диалекта Hy.
Python Meetup - встречи минского сообщества любителей языка программирования Python.
Присоединяйся к нам!
Мы в twitter: https://twitter.com/pythonminsk
Мы на youtube: http://www.youtube.com/pythonMinsk
Мы на slideshare: http://www.slideshare.net/MinskPythonMeetup
This document discusses the React application lifecycle and component lifecycle methods. It explains the different phases a React component goes through:
1. Mounting/Birth which includes initialization, getting default props/state, componentWillMount, render(), and componentDidMount.
2. Updating/Growth which involves receiving new props, re-rendering if needed, componentWillUpdate, render(), componentDidUpdate.
3. Unmounting/Death includes cleanup with componentWillUnmount before the component is removed from the DOM.
It provides code examples for using state, props, lifecycle methods, and testing React components with Jest and snapshots.
#13 "Управление состоянием в Redux" Роман СальниковJSib
Один из трендов в разработке приложений на JavaScript - разделение состояния и отображения. В докладе речь пойдет о том, как мы применили для этих целей библиотеку Redux. Расскажу, больно ли ломать мозг новым подходом (спойлер: да), обязательно ли писать все на React (спойлер: нет), стало ли легче разрабатывать и тестировать (спойлер: вы не поверите).
React новая эра фронтенд разработки / Роберт Харитонов (Liberty Global)Ontico
React(JS) — это современная библиотека для разработки UI компонентов от Facebook, по праву считающаяся самой трендовой технологией среди JavaScript разработчиков на 2015/16 год.
Но каким образом React стал настолько популярен в среде разработчиков, учитывая что библиотека покрывает только View из необходимого минимума MVC архитектуры? Ответ таится в экосистеме технологий, в рамках которой нам открываются совершенно новые способы разработки приложений, не только для веба, но и нативных платформ с родным UI (iOS, Android, Win 10, OSx).
Роберт расскажет, почему огромная популярность React более чем заслужена, и почему это не "очередной фреймворк", а чуть ли не самое большое изменение в JavaScript разработке за последние годы.
Занятие №3 в рамках Курсов программирования Ruby on Rails.
Группа курсов «ВКонтакте»: http://vk.com/ruby_school
Организатор — Агентство интернет-маркетинга Мэйк makeagency.ru. Курсы проводятся на базе Кузбасского государственного технического университета, кафедры «Информационные и автоматизированные производственные системы».
PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротковpgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Регулярные выражения — мощный и широко применяемый инструмент для обработки текстовых данных. При поиске по регулярному выражению в большом наборе строк, становится актуальным вопрос о применении индекса. В то же время, использование индексов для поиска по регулярному выражению — нетривиальная задача.
Существует два основных подхода к выполнению поиска по регулярным выражениям с помощью индекса: "FREE indexing engine" [1], основанный на выделении из регулярного выражения непрерывных фрагментов текста, а также метод, разработанный для Google Code Search [2], осуществляющий рекурсивный анализ составных частей регулярного выражения, с целью выявления его атрибутов. В целом же, оба этих подхода используют обратные индексы на основе k-грам (подстрок исходной строки длины k) и различаются методом извлечения k-грам из регулярного выражения для последующего поиска по индексу.
Данный доклад представляет новый метод извлечений k-грам из регулярного выражения, основанный не на анализе исходного регулярного выражения, а на преобразовании соответствующего конечного автомата. Предлагаемый подход позволяет осуществить более полное извлечение k-грам из регулярного выражения, что подтверждается примерами. Данный подход был реализован в модуле pg_trgm СУБД PostgreSQL 9.3 [3].
3. Вступление
Любой текст, таблицы с данными, списки файлов, код
программы, содержат в себе определенный набор
символов.
Часто возникает задача поиска слов или выражений,
принадлежащих к одному типу, но с возможными
вариациями в написании, такие как даты, имена файлов с
определенным расширением и стандартным названием,
e-mail адреса. С другой стороны, есть задачи по
нахождению вполне определенных слов, которые могут
иметь различное написание, либо поиск, исключающий
отдельные символы или классы символов.
Для этих целей были созданы определенные системы,
основанные на описании текста при помощи шаблонов.
К таким системам относятся и регулярные выражения.
4. Маски поиска
Любой поиск основан на поиске по некоторому образцу —
шаблону или маске поиска.
Шаблон поиска задается при помощи специальных символов:
символы-джокеры или метасимволы — символы, которые
используются для замены других символов или их
последовательностей, приводя таким образом к символьным
шаблонам.
Основные такие символы известны и часто используются при
поиске файлов на диске или информации в поисковиках.
5. Маски поиска
Поиск cpp файлов в текущем каталоге
$ find . -iname '*.cpp'
./example2.cpp
./example.cpp
* - заменяет любую последовательность символов, в том числе и отсутствие
символов.
6. Маски поиска
Поиск cpp файлов в текущем каталоге
$ find . -iname '*.cpp'
./example2.cpp
./example.cpp
* - заменяет любую последовательность символов, в том числе и отсутствие
символов.
Поиск файлов .cpp, .hpp и т.д. в текущем каталоге
$ find . -iname '*.?pp'
./example2.cpp
./2.hpp
./example.cpp
? - замена одного любого символа.
7. Маски поиска
Поиск cpp файлов в текущем каталоге
$ find . -iname '*.cpp'
./example2.cpp
./example.cpp
* - заменяет любую последовательность символов, в том числе и отсутствие
символов.
Поиск файлов .cpp, .hpp и т.д. в текущем каталоге
$ find . -iname '*.?pp'
./example2.cpp
./2.hpp
./example.cpp
? - замена одного любого символа.
Поиск cpp или hpp файлов в текущем каталоге
$ find . -iname '*.[ch]pp'
./example2.cpp
./2.hpp
./example.cpp
[ ] - поиск символов, содержащихся в скобках.
8. Регулярные выражения
Регулярные выражения (англ. regular expressions, сокр. RegExp,
RegEx, жарг. регэкспы или регексы) — система синтаксического
разбора текстовых фрагментов по формализованному шаблону,
основанная на системе записи образцов для поиска.
Образец (англ. pattern) задает правило поиска, по-русски также
иногда называется «шаблоном», «маской». Регулярные выражения
произвели прорыв в электронной обработке текста в конце XX века.
Они являются развитием символов-джокеров (англ. wildcard
characters).
Сейчас регулярные выражения используются многими текстовыми
редакторами и утилитами для поиска и изменения текста на основе
выбранных правил. Многие языки программирования поддерживают
регулярные выражения для работы со строками. Например, Java,
.NET Framework, Perl, PHP, JavaScript, Python и др. имеют
встроенную поддержку регулярных выражений.
Набор утилит (включая редактор sed и фильтр grep), поставляемых
в дистрибутивах UNIX, одним из первых способствовал
популяризации понятия регулярных выражений.
9. GREP
grep — утилита командной строки, которая находит на вводе строки,
отвечающие заданному регулярному выражению, и выводит их.
Название представляет собой акроним английской фразы «search
Globally for lines matching the Regular Expression, and Print them» —
«искать везде строки, соответствующие регулярному выражению, и
выводить их».
Команда grep сопоставляет строки исходных файлов с шаблоном,
заданным базовым регулярным выражением. Если файлы не
указаны, используется стандартный ввод. Обычно каждая успешно
сопоставленная строка копируется на стандартный вывод; если
исходных файлов несколько, перед найденной строкой выдается
имя файла. В качестве шаблонов воспринимаются базовые
регулярные выражения (выражения, имеющие своими значениями
цепочки символов, и использующие ограниченный набор
алфавитно-цифровых и специальных символов).
10. Использование grep
grep использует в качестве шаблона базовые регулярные
выражения.
Базовые регулярные выражения – BRE (Basic Regular
Expressions)
Синтаксис базовых регулярных выражений на данный момент
определён как устаревший, но он до сих пор широко
распространён из соображений обратной совместимости.
Многие UNIX-утилиты используют такие регулярные
выражения по умолчанию.
BRE определяются некоторым набором стандартных
метасимволов и правилами их написания.
Рассмотрим в качестве примера для поиска cpp файл и
увидим, какие возможности предоставляет для работы с ним
grep.
11. Поиск простых слов
(Слово — набор символов ограниченный с обоих сторон
символами пунктуации или спец символами)
Grep может просто искать конкретное слово:
$ grep Hello ./example.cpp
printf("Hello world!n"); //Standard string
12. Поиск простых слов
(Слово — набор символов ограниченный с обоих сторон
символами пунктуации или спец символами)
Grep может просто искать конкретное слово:
$ grep Hello ./example.cpp
printf("Hello world!n"); //Standard string
Или строку, но в таком случае её нужно заключать в кавычки:
$ grep 'Hello world' ./example.cpp
printf("Hello world!n"); //Standard string
13. Поиск простых слов
(Слово — набор символов ограниченный с обоих сторон
символами пунктуации или спец символами)
Grep может просто искать конкретное слово:
$ grep Hello ./example.cpp
printf("Hello world!n"); //Standard string
Или строку, но в таком случае её нужно заключать в кавычки:
$ grep 'Hello world' ./example.cpp
printf("Hello world!n"); //Standard string
Часто слово может быть записано в другом регистре — в
таком случае можно использовать ключ, игнорирующий
регистр:
$ grep -i sum ./example.cpp
/*returns sum of two numbers*/
int Sum(int a, int b)
printf("Num1 + Num2 = %in", Sum(number1, number2)); //Call of function Sum and print result
14. [ ] - перечисление символов
Часто возникает ситуация, когда точное написание искомого
слова неизвестно. В этом случае можно использовать
квадратные скобки:
$ grep -i N[ua]m1 ./example.cpp
int Nam1 = 3; //varible 3
printf("Num1 = % i, Num2 = %in", number1, number2); //Print variables
printf("Num1 + Num2 = %in", Sum(number1, number2)); //Call of function Sum and print result
Grep ищет совпадения по шаблону, где на месте второго
символа может быть как u, так и a, т.е. Совпадения типа:
Num1, Nam1, num1, nam1.
15. . - точка
(замена любого печатного символа)
В некоторых случаях может быть неизвестен какой-либо
символ в искомом выражении:
$ grep -i swa. ./example.cpp
void swap(int *a, int *b)
void swa()
swap(&number1, &number2); //Call of function
Поиск слова swap, после которого идет любой печатный
символ.
16. . - точка
(замена любого печатного символа)
В некоторых случаях может быть неизвестен какой-либо
символ в искомом выражении:
$ grep -i swa. ./example.cpp
void swap(int *a, int *b)
void swa()
swap(&number1, &number2); //Call of function
Поиск слова swap, после которого идет любой печатный
символ.
Таким образом запрос
$ grep -i 'swa().' ./example.cpp
Не найдет ничего, поскольку после swa() идет перевод строки.
17. * - отсутствие или повторение
символа
Иногда символ может появляться в тексте более одного раза
подряд или не появляться вообще.
$ grep -i Hel*o ./example.cpp
long heo = 123;
printf("Hello world!n"); //Standard string
Так в переменной heo вообще нет символа l, в то время как в
слове Hello их 2.
18. Спец символы
(^ - начало строки, $ - конец строки)
$ grep -i ^#include ./example.cpp
#include <cstdio>
Поиск шаблона который стоит вначале строки.
Можно использовать такой запрос для поиска всех
подключенных файлов.
19. Спец символы
(^ - начало строки, $ - конец строки)
$ grep -i ^#include ./example.cpp
#include <cstdio>
Поиск шаблона который стоит вначале строки.
Можно использовать такой запрос для поиска всех
подключенных файлов.
$ grep ';$' ./example.cpp
*a = *a xor *b;
*b = *a xor *b;
*a = *a xor *b;
return (a + b);
long heo = 123;
Поиск всех строчек, которые заканчиваются ;
20. Некоторые ключи
Если файл довольно большой, то оказывается удобным знать
еще и номер строки:
grep -i -n hello ./example.cpp
27:printf("Hello world!n"); //Standard string
21. Некоторые ключи
Если файл довольно большой, то оказывается удобным знать
еще и номер строки:
grep -i -n hello ./example.cpp
27:printf("Hello world!n"); //Standard string
А следующий запрос выводит весь код, исключая строки,
содержащие только комментарии:
egrep -v ^/[/*] ./example.cpp
При использовании ключа -v grep выводит не совпадающие с
шаблоном строки.
^ - мета символ начала строки
[] позволяют находить комментарии обоих типов, т.е. в файле
примера:
//change values of to numbers
/*returns sum of two numbers*/
22. EGREP
egrep — это короткий вызов grep c ключом -E
Отличие от grep заключается в возможности использовать расширенные
регулярные выражения с использованием символьных классов POSIX.
POSIX® (англ. Portable Operating System Interface for UniX — Переносимый
интерфейс операционных систем Unix) — набор стандартов, описывающих
интерфейсы между операционной системой и прикладной программой.
Стандарт создан для обеспечения совместимости различных UNIX-подобных
операционных систем и переносимости прикладных программ на уровне
исходного кода, но может быть использован и для не-Unix систем.
Расширенные регулярные выражения или ERE (Extended Regular
Eexpressions ):
1. Отменено использование обратной косой черты для метасимволов { } и ( ).
2. Обратная косая черта перед метасимволом отменяет его специальное
значение.
3. Добавлены метасимволы +, ?, |.
4. Возможность использования символьных классов POSIX
23. Квантификаторы
?, *, +, {n,m}
$ egrep swap? ./example.cpp
void swap(int *a, int *b)
void swa()
swap(&number1, &number2); //Call of function
Сопоставляет шаблон, где после слова swa может стоять или
нет символ p.
? - является упрощенным вызовом {0,1}, т.е. проверкой на
наличие или отсутствие символа, стоящего перед
квантификатором.
Запрос $ egrep 'swap{0,1}' ./example.cpp выдает аналогичный
результат.
24. Квантификаторы
?, *, +, {n,m}
$ egrep -i 'Hel*' ./example.cpp
long heo = 123;
printf("Hello world!n"); //Standard string
* - является упрощенным вызовом {0,}, т.е. проверкой на
отсутствие или наличие любого количества повторяющегося
символа, стоящего перед квантификатором.
$ egrep -i 'Hel+' ./example.cpp
printf("Hello world!n"); //Standard string
+ - является упрощенным вызовом {1,}, т.е. проверкой на
наличие любого количества (один и более) повторяющегося
символа, стоящего перед квантификатором.
25. Квантификаторы
?, *, +, {n,m}
В примерах выше в качестве выражения перед
квантификаторами выступал символ, но вообще может и
некоторое более сложное выражение.
$ egrep -i '[lu]{2,2}' ./example.cpp
#include <cstdio>
//change values of to numbers
printf("Hello world!n"); //Standard string
swap(&number1, &number2); //Call of function
printf("Num1 + Num2 = %in", Sum(number1, number2)); //Call of function Sum and print result
Выражение [lu]{2,2} аналогично [lu][lu], т.е. ищутся стоящие
подряд символы из [], последовательности: uu, ll, ul, lu.
Общим выражением для квантификаторов является {n,m},
означающее, что в искомом тексте может стоять не менее n
(или ноль, если n не задано), но и не более m (или любое кол-
во, если m не задано) выражений подряд, определяющихся
вырожением перед квантификатором.
26. Символьные классы
$ egrep 'number1 = [0-9]' ./example.cpp
Позволяет найти строчки, где переменной присваивается
определенное значение
int number1 = 1; //varible 1
В скобках указывается диапазон символов от начального до
конечного. [0-9] эквивалентно [0123456789].
$ egrep [a-z]+[0-9]+ ./example.cpp
Позволяет найти строки с нумерованными переменными:
int number1 = 1; //varible 1
int number2 = 3; //varible 2
int Nam1 = 3; //varible 3
swap(&number1, &number2); //Call of function
printf("Num1 = % i, Num2 = %in", number1, number2); //Print variables
printf("Num1 + Num2 = %in", Sum(number1, number2)); //Call of function Sum and print result
Переменные могут состоять только из символов нижнего
регистра от a до z.
27. Символьные классы
Символьные классы:
[0-9] — цифры
[A-Z] — заглавные буквы
[a-z] — буквы нижнего регистра
Они могут находится в одних скобках в любом порядке.
По сути — это сокращенная запись перечисления всех
символов в определенном промежутке.
$ egrep [A-Za-z][a-z]*[0-9]+ ./example.cpp
Позволяет найти строки с нумерованными переменными:
int number1 = 1; //varible 1
int number2 = 3; //varible 2
int Nam1 = 3; //varible 3
swap(&number1, &number2); //Call of function
printf("Num1 = % i, Num2 = %in", number1, number2); //Print variables
printf("Num1 + Num2 = %in", Sum(number1, number2)); //Call of function Sum and print result
Переменные могут начинаться с загловной, но остальное
может состоять только из символов нижнего регистра от a до
z.
28. Поиск по файлам
Существует возможность поиска по нескольким файлам и в
таком случае перед строкой выводится имя файла.
$ egrep -i Hello ./example.cpp ./example2.cpp
./example.cpp: printf("Hello world!n"); //Standard string
./example2.cpp: printf("Hello world!n"); //Standard string
29. SED
sed (от англ. Stream EDitor) — потоковый текстовый редактор
(а также язык программирования), применяющий различные
предопределённые текстовые преобразования к
последовательному потоку текстовых данных.
Первоначально был написан как UNIX-утилита Ли Макмахоном
(Lee E. McMahon) из Bell Labs в 1973—74 годах. Сейчас sed
доступен фактически для любой операционной системы,
поддерживающей работу с командной строкой.
30. Использование SED
Sed можно использовать как grep, выводя строки по шаблону
базового регулярного выражения:
$ sed -n /Hello/p ./example.cpp
printf("Hello world!n"); //Standard string
Можно использовать его для удаления строк (удаление всех
пустых строк):
$ sed /^$/d ./example.cpp
После чего отредактированный текст выведется на
стандартный вывод. При этом исходный файл не изменится.
Sed имеет возможность сразу заменять редактируемый файл
результатом при помощи флага -i
$ sed -i /^$/d ./example.cpp
31. Использование s//
Основным инструментом работы с sed является выражение
типа:
$ sed s/искомое_выражение/чем_заменить/имя_файла
Так, например, если выполнить команду:
$ sed s/int/long/ ./example.cpp
То все найденные последовательности int будут заменены на
long.
32. Использование s//
Основным инструментом работы с sed является выражение
типа:
$ sed s/искомое_выражение/чем_заменить/ имя_файла
Так, например, если выполнить команду:
$ sed s/int/long/ ./example.cpp
То все найденные последовательности int будут заменены на
long.
Но есть проблема заключающаяся в том, что появится и такая
строка:
prlongf("Hello world!n"); //Standart string
Для того, чтобы найти верный запрос рассмотрим 2 других
примера:
33. Использование ERE в s//
(расширенных регулярных выражений)
Ключ -r позволяет использовать расширенные регулярные
выражения.
$ sed -r 's///.*$//g' ./example2.cpp
Этот запрос позволяет убрать комментарии из файлов.
/ - экранированный символ /
.* - любая последовательность символов
$ - конец строки
34. Использование s// и n
(n=0,1...10)
Заменим функцию foo с параметрами на функцию bar, а
функцию foo без параметров не изменять.
$ sed -r 's/foo(([^)]+))/bar1/' ./example2.cpp
foo(int *a,int *b) → bar(int *a,int *b)
foo(&number1, &number2); → bar(&number1, &number2);
( и ) - экранированные скобки
(([^)]+)) - скобки, внутри которых есть какое-то выражение
1 - подстановка выражения в скобках
35. Использование s//
Теперь можем поправить изначальный запрос
$ sed s/int/long/ ./example.cpp
Его правильно записать так:
$ sed -r 's/([^a-zA-Z0-9_])int([^a-zA-Z0-9_])/1long2/g'
./example.cpp
([^a-zA-Z0-9_]) - скобки, внутри которых выражение 1 (перед
int)
([^a-zA-Z0-9_]) - скобки, внутри которых выражение 2 (после
int)
Где 1 и 2 означает подстановку найденного соответствия
выражению в скобках.
36. Sed скрипты
Существует возможность использовать sed скрипты,
содержащие очень сложные выражения для замены.
Но их расматривать мы не будем.