gpt4 book ai didi

macos - sed中的十六进制代码-在OSX上表现不正常

转载 作者:行者123 更新时间:2023-12-04 13:28:02 27 4
gpt4 key购买 nike

我的问题的答案可能存在于SO上,但老实说,我看上去很努力,找不到它。我得到的最接近的是this Q&A,但是我无法在我的机器上重现它们的结果(OSX 10.7.5,使用bash)。

这实际上是一个问题:我无法获得sed来将\xnn(例如\x41A)解释为十六进制字符。特别让我发疯的是:

echo -e '\x41' 

结果为 A-因此操作系统及其功能可以理解我的十六进制代码...
echo -e '\x41' | sed 's/A/B/'

结果为 B-如预期的那样,因为十六进制代码在 A看到之前已转换为 sed

echo A | sed 's/\x41/B/'

结果为 A-我原本希望 B
我已经尝试过类似的东西
echo A | LANG='C' sed 's/\x41/B/'

结果为 A
echo A | LANG='' sed 's/\x41/B/'

同上...
echo A | sed 's/[\x41]/B/'

结果为 A
但...
echo A | sed 's/[\x41-\x41]/B/'

结果为 B ???

我是不是完全愚蠢?还是 sed真的有一些奇怪的东西吗?它显然可以解释一个范围内的十六进制代码,但我无法将其解释为单个字符。我想念什么?

请注意-我正在寻找答案,既可以解释上述原因,也可以解释在OSX平台上可以在 sed字符串中的任何位置插入单个十六进制代码的方法。这意味着在 s/命令的“搜索”部分和“替换”部分中。因为我已经清楚地表明,我可以使用[\xnn-\xnn]搜索单个字符;那不是我要的答案。

提前致谢!

最佳答案

关于“操作系统及其功能可以理解”的内容,没有一个通用的概念-每个程序,功能等都可以理解其自己的特定的元字符集,转义符等。而且,碰巧sed并不执行十六进制代码。但是bash确实可以(如果您要求的话),因此您可以在使用sed调用$''之前让它进行翻译:

$ echo A | sed $'s/\x41/B/'
B

请注意,这还会在将其他转义序列传递给 sed之前解释其他转义序列,因此,如果要将任何转义传递给 sed,则需要对它们进行两次转义,或切换引号模式,以便仅相关部分位于 $''中:
$ echo A | sed $'s/\\(\x41\\)/B\\1/' # double-escapes for sed's escape sequences
BA
$ echo A | sed 's/\('$'\x41''\)/B\1/' # equivalent with different quote modes
BA
$ echo A | sed 's/\(A\)/B\1/' # simplest equivalent version
BA

而且,如果您想在变量而不是常量字符串中解释十六进制转义,那么您几乎必须使用shell的 printf内置函数:
$ hex=41
$ echo A | sed "s/$(printf "\x$hex")/B/"
B

关于macos - sed中的十六进制代码-在OSX上表现不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14889005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com