Это не работает:
$ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)/4 ))/e'
Unknown regexp modifier "/4" at -e line 1, at end of line
syntax error at -e line 1, near "s/(\w{3})/sprintf("%d", ( hex($1)/4 )"
Execution of -e aborted due to compilation errors.
Это делает:
$ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)\/4 ))/e'
812
Так же, и это может быть проще следовать:
$ echo 'cb0' | perl -p -e 's|(\w{3})|sprintf("%d", ( hex($1)/4 ))|e'
812
Когда вы используете символ /
в качестве символа разделителя в подстановке, тогда все вхождения /
в вашем выражении будут рассматриваться как разделители.Если вы хотите, чтобы один из них был виден как что-то другое (например, оператор деления), вам нужно его избежать (поставив перед ним \
).
Другой вариант - выбрать другой разделитель дляваша замена.В третьем примере я переключился на использование |
.В этом случае /
больше не рассматривается как особый и не нуждается в экранировании.