我有这个脚本:
PATTERN=xAB
dd if=/dev/zero count=1 bs=10 | sed "s/\x0/\${PATTERN}/g" > test_ab
hexdump -C test_ab
我得到的输出是:
$ ./make_test
1+0 records in
1+0 records out
10 bytes copied, 0.000147938 s, 67.6 kB/s
00000000 24 7b 50 41 54 54 45 52 4e 7d 24 7b 50 41 54 54 |${PATTERN}${PATT|
00000010 45 52 4e 7d 24 7b 50 41 54 54 45 52 4e 7d 24 7b |ERN}${PATTERN}${|
00000020 50 41 54 54 45 52 4e 7d 24 7b 50 41 54 54 45 52 |PATTERN}${PATTER|
00000030 4e 7d 24 7b 50 41 54 54 45 52 4e 7d 24 7b 50 41 |N}${PATTERN}${PA|
00000040 54 54 45 52 4e 7d 24 7b 50 41 54 54 45 52 4e 7d |TTERN}${PATTERN}|
00000050 24 7b 50 41 54 54 45 52 4e 7d 24 7b 50 41 54 54 |${PATTERN}${PATT|
00000060 45 52 4e 7d |ERN}|
00000064
我希望文件填充0xAB。
答案1
您的变量名为
PATTERN1
,但您使用 来调用它${PATTERN}
(缺少 1)。你逃脱了
$
,所以你的变量将不是被替代。使用ANSI-C 引用(
$'...'
)直接将分配0xAB
给变量。
$ PATTERN=$'\xAB'
$ dd if=/dev/zero count=1 bs=10 | sed "s/\x0/${PATTERN}/g"
1+0 records in
1+0 records out
10 bytes copied, 7,784e-05 s, 128 kB/s
����������
或者,更改您的引用:
PATTERN=xAB
dd if=/dev/zero count=1 bs=10 | sed 's/\x0/\'"${PATTERN}"'/g'
或者使用第二个反斜杠来转义反斜杠:
PATTERN=xAB
dd if=/dev/zero count=1 bs=10 | sed "s/\x0/\\${PATTERN}/g"
答案2
对于字节/字符音译,您可能需要使用 sed 的y
命令而不是其s
命令:
$ PATTERN=xAB
$ dd if=/dev/zero count=1 bs=10 | sed "y/\x00/\\${PATTERN}/" | od -tx1
1+0 records in
1+0 records out
0000000 ab ab ab ab ab ab ab ab ab ab
10 bytes copied, 0.0005294 s, 18.9 kB/s0000012
或者可能更有效tr
地代替使用sed
- 你只需要从十六进制转换为八进制:
$ PATTERN=xAB
$ dd if=/dev/zero count=1 bs=10 | tr '\000' "$(printf '\\%o' "${PATTERN/#/0}")" | od -tx1
1+0 records in
1+0 records out
10 bytes copied, 0.0006387 s, 15.7 kB/s
0000000 ab ab ab ab ab ab ab ab ab ab
0000012
或者
$ printf -v PATTERN '\\%o' 0xAB
$ dd if=/dev/zero count=1 bs=10 | tr '\000' "${PATTERN}" | od -tx1
1+0 records in
1+0 records out
10 bytes copied, 0.000605 s, 16.5 kB/s
0000000 ab ab ab ab ab ab ab ab ab ab
0000012