RE 错误:Mac OS X 上的非法字节序列

2024-04-06

我正在尝试替换 Mac OS X 上 Makefile 中的字符串以交叉编译到 iOS。该字符串嵌入了双引号。命令是:

sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure

错误是:

sed: RE error: illegal byte sequence

我尝试过转义双引号、逗号、破折号和冒号,但没有任何乐趣。例如:

sed -i "" 's|\"iphoneos-cross\"\,\"llvm-gcc\:\-O3|\"iphoneos-cross\"\,\"clang\:\-Os|g' Configure

我正在花很长时间调试这个问题。有谁知道如何获得sed打印非法字节序列的位置?或者有人知道非法字节序列是什么?


A sample command that exhibits the symptom: sed 's/./@/' <<<$'\xfc' fails, because byte 0xfc is not a valid UTF-8 char.
Note that, by contrast, GNU sed (Linux, but also installable on macOS) simply passes the invalid byte through, without reporting an error.

使用以前接受的答案 https://stackoverflow.com/a/19770395/45375如果您不介意失去对您的真实语言环境的支持,这是一个选项(如果您使用的是美国系统并且您从不需要处理外来字符,那可能没问题。)

但是,那可以达到同样的效果ad-hoc for a 单一命令 only:

LC_ALL=C sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure

注意:重要的是有效的 LC_CTYPE的设定C, so LC_CTYPE=C sed ... would normally也有效,但如果LC_ALL碰巧被设置(除了C),它将覆盖个人LC_*- 类别变量,例如LC_CTYPE。因此,最稳健的方法是设置LC_ALL.

然而,(有效地)设置LC_CTYPE to C处理字符串就好像每个字节都是它自己的字符 (no执行基于编码规则的解释),其中不考虑对于 - 多字节按需 -UTF-8编码OS X 默认情况下使用的,其中外文字符 have 多字节编码.

简而言之:setting LC_CTYPE to C导致 shell 和实用程序仅将基本英文字母识别为字母(7 位 ASCII 范围内的字母),以便外国字符。不会被视为信件,例如导致大写/小写转换失败。

再说一次,如果你不需要的话,这可能没问题match多字节编码字符,例如é,并且只是想传递这些字符.

如果这还不够和/或您想要了解原因原始错误的信息(包括确定导致问题的输入字节)以及执行编码转换一经请求,read on below.


问题是输入文件的编码与 shell 的编码不匹配。
进一步来说,输入文件包含以 UTF-8 无效方式编码的字符(正如 @Klas Lindbäck 在评论中所说) - 这就是sed错误消息试图通过invalid byte sequence.

最有可能的是,您的输入文件使用单字节8位编码例如ISO-8859-1,经常用于编码“西欧”语言。

Example:

带重音的字母à有 Unicode 代码点0xE0(224) - 与中相同ISO-8859-1。然而,由于性质UTF-8编码,这个单个代码点表示为2字节 -0xC3 0xA0,而试图通过单字节 0xE0 is invalid在 UTF-8 下。

这是一个问题的演示使用字符串voilà编码为ISO-8859-1,与à表示为one字节(通过 ANSI-C 引用的 bash 字符串 ($'...')使用\x{e0}创建字节):

请注意,sed命令实际上是一个无操作,只是简单地传递输入,但我们需要它来引发错误:

  # -> 'illegal byte sequence': byte 0xE0 is not a valid char.
sed 's/.*/&/' <<<$'voil\x{e0}'

简单来说ignore问题, 以上LCTYPE=C可以使用的方法:

  # No error, bytes are passed through ('á' will render as '?', though).
LC_CTYPE=C sed 's/.*/&/' <<<$'voil\x{e0}'

如果你想确定输入的哪些部分导致问题,尝试以下操作:

  # Convert bytes in the 8-bit range (high bit set) to hex. representation.
  # -> 'voil\x{e0}'
iconv -f ASCII --byte-subst='\x{%02x}' <<<$'voil\x{e0}'

输出将以十六进制形式显示设置了高位的所有字节(超出 7 位 ASCII 范围的字节)。 (但请注意,这还包括正确编码的 UTF-8 多字节序列 - 需要更复杂的方法来专门识别无效的 UTF-8 字节。)


按需执行编码转换:

标准实用程序iconv可用于转换为 (-t) 和/或来自 (-f) 编码;iconv -l列出所有支持的。

例子:

转换自ISO-8859-1到 shell 中有效的编码(基于LC_CTYPE,即UTF-8-默认情况下基于),基于上面的示例:

  # Converts to UTF-8; output renders correctly as 'voilà'
sed 's/.*/&/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"

请注意,这转换允许您正确匹配外来字符:

  # Correctly matches 'à' and replaces it with 'ü': -> 'voilü'
sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"

将输入 BACK 转换为ISO-8859-1处理后,只需将结果传送到另一个iconv命令:

sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')" | iconv -t ISO-8859-1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RE 错误:Mac OS X 上的非法字节序列 的相关文章

  • 使用不同的苹果帐户更新 XCODE

    我的操作系统是 MAC 10 7 3 xcode 4 3 1 使用不同的 apple id 安装 因为我的 macbook pro 以前被我的朋友使用过 现在 当我尝试将 Xcode 升级到 4 3 2 时 它会询问我朋友帐户的凭据 不幸的
  • python:正则表达式匹配文件扩展名

    您好 我正在尝试获取 url 中调用的文件的扩展名 例如 wp includes js jquery jquery js ver 1 3 2 HTTP 1 1 并获取传递到文件的查询参数 延期的最佳方式是什么 urlparse urlpar
  • 通过shell脚本进行串口控制

    我正在开发一个方向控制器 我有一个开发板 它通过 I2C 与传感器 指南针 通信 由于主板非常有限 没有操作系统 我开发了一个简单的程序来接收以下内容 1 get 0 读取传感器的寄存器 0 2 set 0 10 将传感器的寄存器 0 设置
  • 当前收据无效或不匹配的 ds 人员 ID

    我正在尝试测试 MacOS 的应用内购买 输入测试用户凭据后 App Store 抱怨 当前收据无效或 ds 人员 ID 不匹配 并且购买失败 我尝试了很多方法来解决这个问题 获取 App Store 收据 http www kotanco
  • 在 OS X 中,如何检测当前活动应用程序何时发生变化?

    尝试为 OS X 编写一个应用程序 该应用程序根据当前的应用程序触发行为 它不需要与它交互 它只需要知道何时更改以及更改内容 任何人都可以推荐哪些 API 可用于此目的吗 我的猜测是辅助服务中的某些内容 因为这是大多数应用程序 例如 Bet
  • 版本差异? Java 中的正则表达式转义

    看来正则表达式转义在不同版本的 Java 中的工作方式不同 在 Java openjdk 16 0 1 中编译工作正常 在 Java openjdk 11 0 11 中抛出此编译错误 test java 15 error illegal e
  • grep 的贪婪行为

    我认为在正则表达式中 贪婪 适用于量词而不是整个匹配 然而 我观察到 grep E color auto a ab lt printf aab returns aab而不是aab 这同样适用于 sed 另一方面 在 pcregrep 和其他
  • .NET 正则表达式可匹配任何语言的任何类型的字母

    我可以使用哪种正则表达式来匹配 允许 任何语言的任何类型的字母 我需要匹配任何字母 包括任何变音符号 例如 并排除任何类型的符号 数学符号 货币符号 装饰符号 方框图字符等 和标点符号 我正在使用 ASP NET MVC 2 和 NET 4
  • PHP 删除字符最后一个实例之前的所有内容

    有没有办法删除某个字符之前的所有内容 包括最后一个实例 我有多个字符串 其中包含 gt e g the gt cat gt sat gt on gt the gt mat welcome gt home 我需要对字符串进行格式化 以便它们变
  • 如何使用 sed 将空格替换为 \(space)?

    当我使用 sed 将所有空格替换为 X 时 该命令有效 命令为 sed s X g filelist tmp 但是 当我尝试用 space 替换所有出现的空格时 代码是 sed s g filelist tmp 这不起作用 我究竟做错了什么
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢
  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • 如何将查找和替换限制为 CSV 中的一列?

    我有一个 4 列 CSV 文件 例如 0001 fish animal eats worms I use sed对文件进行查找和替换 但我需要将此查找和替换限制为仅在第 3 列中找到的文本 如何让查找和替换仅发生在这一列上 您确定要使用se
  • 数组上的 Bash 子字符串扩展

    我有一组带有给定后缀的文件 例如 我有一组带有后缀的pdf文件 pdf 我想使用子字符串扩展来获取不带后缀的文件名 对于单个文件我可以使用 file test pdf echo file 0 4 要对所有文件执行此操作 我现在尝试 file
  • 每当 SQLERROR 永远不起作用时

    我不知道可能是什么原因 我已经在网上花了几个小时试图找出我的情况出了什么问题 我查过官方文档 https docs oracle com cd B19306 01 server 102 b14357 ch12052 htm还有一些汤姆 凯特
  • SQLite:从命令行仅将模式转储到 .sql 文件中

    我正在尝试转储架构test db仅 即没有数据 到名为的文件中schema sql从 OS X 中的命令行 无需启动 sqlite3 我知道我能做到 sqlite3 open test db output schema sql schema
  • while 循环中 regex.exec() 赋值的更好解决方案

    这里有更好的解决方案吗 我尽量避免里面的作业while但仍然能够循环匹配并使用捕获的组 var match var CSS URL PATTERN url s s s s gm while match CSS URL PATTERN exe
  • 如何将数据通过管道传输到交互式 bash 脚本并将输出通过管道传输到另一个命令?

    我想将数据通过管道传输到交互式命令中 并将交互式命令的输出作为另一个命令的输入接收 例如 我希望能够执行以下操作 echo Zaphod hello sh goodbye sh 并让输出为 再见 你好 赞福德 这是我对此的初步破解 但我遗漏
  • 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

    我有一个脚本 将由非技术用户交互式运行 该脚本将状态更新写入 STDOUT 以便用户可以确定脚本运行正常 我希望将Stdout和STDERR重定向到终端 以便用户可以看到脚本正在工作 并查看是否存在问题 我还希望将两个流都重定向到日志文件

随机推荐

  • isdigit 无法正常工作

    我试图通过迭代整个字符串并输出整数来测试字符串是否包含整数 我的方法涉及将字符串转换为 c string atoic 字符串 然后使用测试它是否是整数isdigit功能 由于某种未知的原因 isdigit尽管函数遇到整数 但它返回 fals
  • 如何选择要在 Ruby 中动态包含的模块版本?

    我正在编写一个小型 Rub y 命令行应用程序 它使用fileutils来自文件操作的标准库 根据用户调用应用程序的方式 我想包括FileUtils FileUtils DryRun or FileUtils Verbose Since i
  • ggplot2:在右侧为一个变量创建第二个 y 轴

    我有一个数据框 在同一时间范围内包含 3 个不同的变量 前两个变量具有相同的比例 股票指数值 可以用 y 轴来说明 第三个变量是利率 范围仅为 0 到 7 因此我专注于在图的右侧创建一个额外的 y 轴来说明它 但经过两天的尝试和失败后 我在
  • 使用powershell获取csv文件中的特定单元格值

    我是 powershell 的新手 不经常使用它 我需要使用 powershell 从 csv 文件输出单元格 A5 的值 我的文件 col1 col2 col3 col4 1002 1005 1006 1007 需要 A1 单元格中的值
  • 无法使用 getDeclaredFields() 检索 Scala 类的字段

    我正在尝试将 Java 库 JOhm 与 Scala 一起使用 并注意到当该库尝试使用以下内容读取我的 Scala 类的字段时它会失败model getClass getDeclaredFields 然后我决定尝试在 Scala 解释器中用
  • 如何在输入按钮中的访问键下划线

    我有一个按钮 我想在访问密钥字母下划线 u u 不起作用 并且C 818 C 改变字体 应该是verdana
  • 带有自定义参数的 Html.DropDownListFor()

    我想在 HTML 帮助程序中添加扩展方法来生成这样的选择和选项
  • 如何使用默认集合和数据创建 Mongo Docker 镜像?

    我需要这里的支持来构建我自己的 mongo docker 镜像 我有一个脚本列表 用于创建数据并将其插入 MongoDB 这些脚本应在我的 Dockerfile 中调用 以提供具有默认集合和数据的 docker 映像 这是我的 Docker
  • 具有依赖预设参数的函数

    请考虑简单的功能 def fun x y param1 10 param2 param1 3 do something Where param1 and param2不应是必需的 但可以由用户设置 如果param2未设置 值取决于param
  • EaselJS - 检测碰撞的最佳方法

    我正在尝试为我的 easelJS 小应用程序找到一种碰撞检测的好方法 我刚刚使用 createjs Shape 创建了 2 个矩形 但是创建一个矩形形状后 API 不让我知道矩形的宽度和高度 我不知道为什么 EaselJS Shape 有一
  • 使用 CSS 动态清除浮动

    我正在尝试用 CSS 创建一个 3 列的博客布局 对于每个新帖子 都会在容器 div 内动态添加一个新的 div 但是 由于我无法手动放置清除元素 因此我在清除浮动时遇到了麻烦 现在看起来是这样的 http jsfiddle net DZA
  • 如何在 Spring Boot 中从 RESTful 控制器返回 HTML 页面?

    我想从控制器返回一个简单的 HTML 页面 但我只得到文件的名称而不是其内容 为什么 这是我的控制器代码 RestController public class HomeController RequestMapping public St
  • 如何使用 git 撤消推送的提交?

    我在远程存储库中有一个项目 与本地存储库 开发 和服务器存储库 产品 同步 我一直在进行一些已提交的更改 这些更改已推送到远程并从服务器中拉出 现在 我想撤消这些更改 所以我可以git checkout到更改之前的提交并提交新的更改 但我猜
  • 按 ProductFlavor 和 buildType 划分的 Gradle SourceSets

    EDIT口味和路径 目前我有 sourceSets whenObjectAdded sourceSet gt def sourceData rootProject ext sourceSet name sourceSet java srcD
  • ASP.NET身份重置密码

    如何在新的 ASP NET Identity 系统中获取用户的密码 或者在不知道当前密码的情况下如何重置 用户忘记密码 或者在不知道当前密码的情况下如何重置 用户忘记密码 如果您想使用 UserManager 更改密码 但不想提供用户的当前
  • Leafletjs GeoJSON 层不适用于来自自然地球的地图数据

    我正在使用 leafletjs 使用 OSM 瓷砖绘制地理地图 我使用以下 GeoJSON 作为地图层http code highcharts com mapdata 1 0 0 custom world js http code high
  • 使用 Javamail 访问 Microsoft Exchange 邮箱(IMAP、MS Exchange)

    我需要通过 IMAPS JavaMail 连接到 Microsoft Exchange Server 首先 我得到了 A1 NO AUTHENTICATE failed javax mail AuthenticationFailedExce
  • Android线程可运行性能

    我想知道两种不同的启动可运行方法的性能和 cpu ram 要求 我有一些代码每 10 毫秒收集一次传感器数据 并将这些值插入到后台线程上的数据库中 使用单线程执行器 Executor服务创建如下 executor Executors new
  • ng2 - DevExtreme 与 Telerik Kendo UI [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在开发一款使用 Angular2 Typescript 和 HTML5 的新软件 对于 UI 组件 我们有 2 个选项 开发极限 Tele
  • RE 错误:Mac OS X 上的非法字节序列

    我正在尝试替换 Mac OS X 上 Makefile 中的字符串以交叉编译到 iOS 该字符串嵌入了双引号 命令是 sed i s iphoneos cross llvm gcc O3 iphoneos cross clang Os g