获取"sed错误 - 非法字节序列"(在bash中)

alt*_*alt 90 bash sed

做一些流编辑来改变令人讨厌的Parallels图标.它开发得很差并嵌入到应用程序本身而不是图像文件.所以我找到了这个有很好反馈的sed命令:

sudo sed -i.bak s/Parallels_Desktop_Overlay_128/Parallels_Desktop_Overlay_000/g /Applications/Parallels\ Desktop.app/Contents/MacOS/prl_client_app
Run Code Online (Sandbox Code Playgroud)

它回来了 sed: RE error: illegal byte sequence

有谁能解释这意味着什么?命令的哪个部分是问题?

ldr*_*drg 149

尝试设置LANG环境变量(LANG=C sed ...)或使用这里提到的二进制sed工具之一:binary sed replacement

为什么错误?

没有LANG=Csed假定文件是以指定的任何编码进行编码的,LANG文件(二进制)可能包含在LANG编码中不是有效字符的字节(因此你可能得到'非法字节序列').

为什么LANG=C工作?

C恰好将所有ASCII字符视为自身,非ASCII字符视为文字.

  • 很好,但是使用`LC_ALL = C sed ...`是更强大的方法:如果设置`LC_ALL`或`LC_CTYPE`(除了`C`之外的其他东西),设置`LANG`将不起作用.(`LC_ALL` _overrides_所有单独设置的类别,如果有的话,而`LANG`仅对那些_not_显式设置的类别生效.) (25认同)
  • 对我来说`LANG = C`没有用,但`LC_ALL = C`没有 (8认同)
  • 如果`bash`是你的shell,你可以输入`export LANG = C`然后再试一次. (4认同)

小智 70

LANG=C单独没有为我做的伎俩,但添加LC_CTYPE=C也解决了它.

  • _ LC_CTYPE = C`的_effective_值足以解决问题:`LC_CTYPE = C sed ...`.但是,如果设置`LC_ALL`(除了'C`之外的其他东西),那将无法工作,因为_overrides_所有单独的`LC_*'类别.因此,最强大的方法是使用`LC_ALL = C sed ...`. (11认同)

小智 22

除了LANG=C和之外LC_CTYPE=C,我还需要做到LC_ALL=C这一点.

LC_ALL覆盖所有单个LC_*类别.因此,最强大的方法是使用LC_ALL=C sed ...- 不需要也处理其他变量.

  • @rpax:实际上,C的有效"LC_CTYPE"值就足够了,所以使用`LC_CTYPE = C sed ...`(直接在违规命令之前)是_normally_ sufficient,_unless_`LC_ALL` - _overrides_ all individual`LC_*`类别 - 已经设定.因此,最强大的方法是使用`LC_ALL = C sed ...` - 不需要也处理其他变量. (2认同)

Ada*_*ite 18

我设法通过运行:

unset LANG
Run Code Online (Sandbox Code Playgroud)

sed命令之前.

不知道我做了什么或为什么它有效,但确实如此.