Следующая производит эффект, который вы хотите:
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 - все разные; если ваше регулярное выражение довольно простое, вам нужно настроить таргетинг на конкретный движок.
Сообщите нам, что вы пытаетесь здесь сделать? –
пытается заменить каждый совпадающий символ (называть положительное совпадение '' '' '' '' и '' 'для каждого символа, переданного по адресу' sed', т. Е. Придерживаться точек после всех символов **, а не ** '\', или ' | ' –
Потому что это регулярное выражение PCRE, и sed не делает этого. –