我创建了 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