2015-06-24 2 views
0

Почему следующиеRegex код протестирован, но не соответствует при использовании с SED

$ echo "test\|String" | sed 's/(?!\||\\)./&./g' 
test\|String 

не производят:

t.e.s.t.\|S.t.r.i.n.g. 

У меня есть tested the regex code и он выбирает строку правильно в моих тестах

Я хочу это сделать:

$ echo "test\|String" | sed 's/(?!\||\\)./&./g' 
t.e.s.t.\|S.t.r.i.n.g. 
+0

Сообщите нам, что вы пытаетесь здесь сделать? –

+0

пытается заменить каждый совпадающий символ (называть положительное совпадение '' '' '' '' и '' 'для каждого символа, переданного по адресу' sed', т. Е. Придерживаться точек после всех символов **, а не ** '\', или ' | ' –

+0

Потому что это регулярное выражение PCRE, и sed не делает этого. –

ответ

5

я бы написал, что вы описали, как это:

echo "test\|String" | sed 's/[^\\|]/&./g' 
1

Следующая производит эффект, который вы хотите:

echo "test\|String" | perl -npe 's/(?!\||\\)./$&./g' 
t.e.s.t.\|S.t.r.i.n.g. 

Не все регулярные выражения двигатели одинаковы. Вы используете что-то близко к PCRE (Perl-Compatible Regular Expressions), но тот, который используется в sed, является более старым, более ограниченным и имеет некоторые причуды, например, с использованием \( и \) для сопоставления групп, а не ( и ). Он не знает о негативных прогнозах. Флаги Perl's -n и -p дают sed -подобное поведение. Обратите внимание, наконец, что Perl использует $&, чтобы указать «полное согласованное выражение», а не &.

Двигатели с регулярным выражением, используемые оболочкой, по grep, по sed, Emacs, POSIX и PCRE - все разные; если ваше регулярное выражение довольно простое, вам нужно настроить таргетинг на конкретный движок.

Смежные вопросы