В потоковом редакторе 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. Если в регулярке несколько групп (сделанных с использованием круглых скобок (...) в регулярном выражении), то они и будут находить "подпаттерны" и будут нумероваться с единицы.
|