为什么鸿沟不起作用?
;
原始输入数据为12位十六进制数。
答案 0 :(得分:4)
用于替换s ///的默认定界符不平衡,因此会出现错误。这是因为您将$ 1除以4,并引入了另一个'/'。因此,为了安全起见,请使用其他会干扰表达式的字符以外的其他字符。在这种情况下,最好使用<>作为delimtier
$ echo 'cb0' | perl -p -e 's<(\w{3})><sprintf("%d", ( hex($1)/4 ))>e '
812
当用其他定界符转换s ///时,必须将<...>,(...),[...]和{...}配对。我选择了<>,因为表达式中没有它。
答案 1 :(得分:2)
这不起作用:
$ 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
在替换中使用/
字符作为分隔符时,表达式中所有出现的/
将被视为分隔符。如果您希望将某人看作其他东西(例如,除法运算符),则需要对其进行转义(将\
放在其前面)。
另一个选择是选择其他分隔符来代替。在第三个示例中,我改用|
。在这种情况下,/
不再被视为特殊字符,不需要转义。
答案 2 :(得分:0)
或者使用其他定界符进行替换,否则您将需要使用反斜杠转义分隔符:
echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)\/4 ))/e'