sed 十六进制替换问题

sed 十六进制替换问题

我创建了 1 字节 NULL 文件用于dd if=/dev/zero of=file.dd bs=1 count=1测试目的。我通过以下测试得到了一个奇怪的结果:

dd if=file.dd | 
  sed 's/\x5e/X/' | 
  xxd
00000000: 5800              X.

如何从 NULL 数据流中sed获取?x5E

谢谢。

答案1

正则表达式^特殊字符是“行开头”的零宽度匹配,并且在输入的开头有一个隐式行。因此,任何被认为由至少一行组成的输入,和sed(或大多数正则表达式工具)都会将其视为这样:

$ printf "\0\0\0" | od -c
0000000   \0  \0  \0
0000003
$ printf "\0\0\0" | sed 's/^/Y/' | od -c
0000000    Y  \0  \0  \0  \n
0000005
$ printf "\0\0\0" | perl -ple 's/^/Y/' | od -c
0000000    Y  \0  \0  \0  \n
0000005

GNUsed额外的并发症处理方式\x5e与以下相同^

$ printf "\0\0\0" | gsed 's/^/Y/' | od -c
0000000    Y  \0  \0  \0
0000004
$ printf "\0\0\0" | gsed 's/\x5e/Y/' | od -c
0000000    Y  \0  \0  \0
0000004

为了匹配文字,必须使用不将or视为特殊的^其他形式 :^\x5e

$ printf "\0\x5e\0" | gsed 's/[=\x5e]/Y/' | od -c
0000000   \0   Y  \0
0000003
$ printf "\0\x5e\0" | perl -pe 's/\x5e/Y/' | od -c
0000000   \0   Y  \0
0000003

相关内容