使用sed替换syscall.Errno中的负数为正数失败,报错无效反向引用
sed命令转换负数为正数失败的问题分析
需求说明
现有文件中存在如下条目:
EMIG_BAD_ID = syscall.Errno( -0x12f)
需要将syscall.Errno()内的负数转为正数,得到结果:
EMIG_BAD_ID = syscall.Errno( 0x12f)
错误尝试及报错
执行以下命令后失败,触发报错:
egrep EMIG_* _error.grep | \ sed -e 's/syscall.Errno(\1)/syscall.Errno(-\1)/g' _error.grep
报错信息:
sed: -e expression #1, char 40: Invalid back reference
命令存在的问题
- 反向引用未定义:sed的
\1代表正则中第一个捕获组的内容,但你的替换表达式里没有用()定义任何捕获组,sed无法识别\1,直接触发无效反向引用的错误。 - 处理逻辑完全颠倒:你的需求是去掉负数前的负号,但表达式里写的是给
\1添加负号,和实际需求完全相反。 - 输入来源冲突:你同时通过管道给sed传输入,又指定了
_error.grep作为文件参数,sed会同时处理管道内容和文件内容,导致逻辑混乱,二者选其一即可。 - egrep的模式解析错误:
EMIG_*会被shell当成通配符,匹配当前目录下以EMIG_开头的文件,而不是作为正则匹配文本中EMIG_开头的行,正确写法应该用单引号包裹模式:egrep 'EMIG_.*' _error.grep。
正确的sed命令示例
直接用sed处理文件,匹配syscall.Errno( -0x...)的结构,去掉负号:
sed -e 's/syscall.Errno( -\(0x[0-9a-f]*\))/syscall.Errno( \1)/g' _error.grep
如果要只处理包含EMIG_的行,可以组合grep和sed:
grep 'EMIG_' _error.grep | sed -e 's/syscall.Errno( -\(0x[0-9a-f]*\))/syscall.Errno( \1)/g'
内容的提问来源于stack exchange,提问作者user1914074
相关产品推荐
相关产品推荐

