2017-02-17 15 views
1

sed -i.bak -e 's/^\s+({\s+group.+;\s+port.+;)\s+cp.+/ \1 }/g' <file>Dumb sed/Regex Mistake?

Я получаю сообщение об ошибке:

sed: -e expression #1, char 48: invalid reference \1 on ``s' command's RHS

Я сделал эту SED подачи команд несколько раз, прежде чем и не имел этот вопрос. Я наткнулся на нюансный характер, который мне не хватает? Я проверил регулярное выражение на веб-сайте, поэтому я уверен, что все в порядке. Я смотрел несколько примеров примеров онлайн только для этого и ничего не могу найти. Заранее спасибо. Пример строки для соответствия:

{ group = "127.0.0.1"; port = 222; cpu = 33; },

+1

ли работа с ' 'S/^ [[: УПП e:]] * \ ({[[: space:]] * group. *; [[: space:]] * port. *; \) [[: space:]] * cp. */\ 1}/g''? –

+1

Я не знаю, является ли это основной проблемой, но: чтобы скопировать скобки нужно было экранировать, '\ s' не поддерживается, вы должны использовать' [\ t] 'вместо или класс символа posix и квант + также не поддерживается. –

+1

Эта ошибка связана с тем, что в режиме по умолчанию BRE 'sed' вы используете unescaped' (...) ', который не создает захваченную группу. Вам нужно использовать флаг '-E' для расширенного режима регулярного выражения, а затем' (...) 'сделает его группой. Кроме того, '\ s' следует заменить на' [\ t] ' – anubhava

ответ

0

Ваше текущее выражение анализируется как BRE (Basic Regular Expression). Это означает:

1) круглые скобки должны быть экранированы в dentote с захвата группы, 2) \s не поддерживается, необходимо заменить [ \t] или [[:space:]] 3) + квантора должен быть превращен в \{1,\}, так как он не поддерживается

Вам необходимо пройти -r вариант (в других операционных системах, -E может сделать эту работу вместо этого), чтобы двигатель разобрать его как ERE:

sed -i.bak -r -e 's/^\s+({\s+group.+;\s+port.+;)\s+cp.+/ \1 }/g' <file>