获得;sed错误-非法字节序列“;(在bash中)
进行一些流编辑以更改讨厌的平行线图标。它开发得很差,并嵌入到应用程序本身,而不是一个图像文件。所以我找到了这个sed命令,它有一些很好的反馈:获得;sed错误-非法字节序列“;(在bash中),bash,sed,Bash,Sed,进行一些流编辑以更改讨厌的平行线图标。它开发得很差,并嵌入到应用程序本身,而不是一个图像文件。所以我找到了这个sed命令,它有一些很好的反馈: sudo sed -i.bak s/Parallels_Desktop_Overlay_128/Parallels_Desktop_Overlay_000/g /Applications/Parallels\ Desktop.app/Contents/MacOS/prl_client_app 它返回sed:RE错误:非法字节序列 有人能解释一下这是什么
sudo sed -i.bak s/Parallels_Desktop_Overlay_128/Parallels_Desktop_Overlay_000/g /Applications/Parallels\ Desktop.app/Contents/MacOS/prl_client_app
它返回sed:RE错误:非法字节序列
有人能解释一下这是什么意思吗?命令的哪个部分有问题?尝试设置
LANG
环境变量(LANG=C sed…
)或使用此处提到的二进制sed工具之一:
为什么会出错?
如果没有LANG=C
sed,则假定文件以LANG
中指定的任何编码进行编码,并且文件(为二进制)可能包含在LANG
编码中无效字符的字节(因此可能会获得“非法字节序列”)
为什么LANG=C
起作用?
C恰好将所有ASCII字符视为它们自己,将非ASCII字符视为文字。
LANG=C
单独使用并不能解决我的问题,但添加了LC_CTYPE=C
并很好地解决了这个问题。我通过运行:
unset LANG
在执行sed
命令之前
我不知道我做了什么,也不知道它为什么起作用,但它确实起了作用。除了
LANG=C
和LC\u CTYPE=C
之外,我还必须做LC\u ALL=C
才能让它起作用
LC\u ALL
覆盖所有单个LC\u*
类别。因此,最可靠的方法是使用LC\u ALL=C sed…
-无需同时处理其他变量。如果bash
是您的shell,您可以输入export LANG=C
并重试。很好,但是使用LC\u ALL=C sed…
是更可靠的方法:如果LC\u ALL
或LC\u CTYPE
已设置(对于非C
)的内容,设置LANG
将无效。(LC\u ALL
覆盖所有单独设置的类别(如果有),而LANG
仅对未明确设置的类别生效。)对我来说,LANG=C
不起作用,但在OSX 10.8上,LC\u ALL=C
对我也起了同样的作用。谢谢!一个有效的LC\u CTYPE=C
值就足以解决这个问题:LC\u CTYPE=C sed…
。但是,如果LC\u ALL
被设置(设置为C
以外的值),这就不起作用了,因为这会覆盖所有单独的LC.*
类别。因此,最可靠的方法是使用LC.*all=C sed…
。这对我在macOS SierraI上的工作很有效。在遵循本教程时,我需要做上述修复:这会删除错误,但实际上对我来说什么也解决不了。至于它为什么有效:如果您的语言环境最初设置为th[export]LANG=…
(与设置LC\u ALL
或单独设置LC\u*
类别相反),然后取消设置LANG
会使所有LC\u*
类别恢复为“C”
;以LC\u CTYPE
值C
结束是解决问题的方法。相反,如果LC\u ALL
或甚至LC\u CTYPE
特别设置为C
以外的值,你的方法将不起作用。@mklement0,我认为你的评论给出了一个很好的答案…!@Arjan:谢谢;我确实创建了一个a回答-不是这个问题,而是一个非常类似的问题:多解释一点,please@rpax:实际上,C的有效LC\u CTYPE
值就足够了,因此使用LC\u CTYPE=C sed…
(直接在有问题的命令之前)通常是足够的,除非设置了覆盖所有单个LC.*
类别的LC.*
。因此,最可靠的方法是使用LC.\u ALL=C sed…
-无需同时处理其他变量。这应该是公认的答案。希望您不介意,我将@mklement0的注释编辑到了answ中呃。@Qix:我的贡献被添加为一条评论,因为我认为编辑太过侵入性:你的编辑相当于把单词放进@rjpeter2的嘴里,并且,以目前的形式,结果是一个有点自相矛盾的答案。请注意,我在本页所有答案的评论中推荐了LC\u ALL=C sed…
方法,包括丁是目前被接受的一个。为了完整的图片,我建议就重复的问题咨询我的同事。那些来自谷歌的人:先试试。我来这个帖子的次数比我想承认的要多。