如何让变量替换与这个 sed 命令一起工作

如何让变量替换与这个 sed 命令一起工作

我有这个脚本:

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

相关内容