MyTetra Share
Делитесь знаниями!
Регулярные выражения в sed
Время создания: 23.09.2009 22:50
Раздел: Компьютер - Программирование - Регулярные выражения
Запись: xintrea/mytetra_syncro/master/base/0000001250/text.html на raw.github.com

В потоковом редакторе sed, для того чтобы спецсимволы рассматривались как обычные символы, можно их экранировать обратным слешем. А можно в качестве разделителей полей вместо прямого слеша "/" использовать двоеточие ":".


Пример:


Нужно закомментировать в *.cpp файле строку "namespace prog1 {", то есть добавить перед строкой символы "//". Это можно сделать различными способами:


sed -i 's/namespace prog1 {/\/\/ namespace prog1 {/' file.cpp

sed -i 's:namespace prog1 {:// namespace prog1 {:' file.cpp

sed -i 's:namespace prog1 {:// &:' file.cpp


Кроме того, некоторые служебные символы, например "+" - надо экранировать обратным слешем. А служебные символы "*", "?", ".", "[", "]" - не нужно:


# echo _0000s_0001_unknown_2.tif | sed 's/_[0-9]\+[a-z]_[0-9]\+_//g'
unknown_2.tif


Группирующие круглые скобки в sed надо экранировать, чтобы они срабатывали как группировка:


\(abc\)


Однако, если включена опция -E, то экранировать круглые скобки не нужно (см. далее).


Внимание! Еще одна особенность sed, как минимум версии 4.1.5, в том, что он не понимает метасиволов вида "\d", "\w" и.т.д. Вместо них нужно использовать [0-9] или [a-z]. Однако, см. примечание.



Примечание 1


По-умолчанию необходимо экранировать все спец. символы в regex'ах, что крайне затрудняет чтение масок. Для того, чтобы экранировать спец.символы только в случае описания в тексте их самих - включите расширенный режим regex выражений с помощью опции -r или -E. Данные опции могут быть не описаны в man sed, но присутсвует в sed --help. Кроме того, опция -E может быть не описана ни в man sed, ни в sed --help, но она нормально определяется и правильно работает, как минимум в sed 4.2.1.


Включение расширенных регулярных выражений - это не значит включение PCRE. Sed не поддерживает PCRE. Расширенные регулярные выражения - это еще один диалект регулярных выражений. От стандартных POSIX выражений они отличаются следующим:



5.4 Overview of extended regular expression syntax

==================================================


The only difference between basic and extended regular expressions is in

the behavior of a few characters: '?', '+', parentheses, braces ('{}'),

and '|'. While basic regular expressions require these to be escaped if

you want them to behave as special characters, when using extended

regular expressions you must escape them if you want them _to match a

literal character_. '|' is special here because '\|' is a GNU extension

- standard basic regular expressions do not provide its functionality.


Examples:

'abc?'

becomes 'abc\?' when using extended regular expressions. It

matches the literal string 'abc?'.


'c\+'

becomes 'c+' when using extended regular expressions. It matches

one or more 'c's.


'a\{3,\}'

becomes 'a{3,}' when using extended regular expressions. It

matches three or more 'a's.


'\(abc\)\{2,3\}'

becomes '(abc){2,3}' when using extended regular expressions. It

matches either 'abcabc' or 'abcabcabc'.


'\(abc*\)\1'

becomes '(abc*)\1' when using extended regular expressions.

Backreferences must still be escaped when using extended regular

expressions.


'a\|b'

becomes 'a|b' when using extended regular expressions. It matches

'a' or 'b'.



Примечание 2


Чтобы использовать регулярные выражения PCRE, можно вместо sed использовать perl:


Чем заменить SED, чтобы работали выражения PCRE?



Как в заменяемую строку вставить найденное выражение?


Например, нужно найти подстроку abc, и "обрамить" ее другими строками, например так: AAAabcBBB.


Команда будет такой:


sed 's/abc/AAA\0BBB/'


Где \0 - это найденная подстрока. Обозначения \0, \1, и т.д. до \9 - это так называемые обратные ссылки. Каждый найденный паттерн/подпаттерн помечается своим номером. Все что попало под регулярку обозначается \0. Если в регулярке несколько групп (сделанных с использованием круглых скобок (...) в регулярном выражении), то они и будут находить "подпаттерны" и будут нумероваться с единицы.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования