如何使用此 sed 命令进行变量替换

arc*_*ber 0 command-line bash sed text-processing

我有这个脚本:

PATTERN=xAB
dd if=/dev/zero count=1 bs=10 | sed "s/\x0/\${PATTERN}/g" > test_ab
hexdump -C test_ab
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

$ ./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
Run Code Online (Sandbox Code Playgroud)

我希望该文件填充 0xAB。

pLu*_*umo 5

    \n
  • 您的变量名为PATTERN1,但您使用${PATTERN} (缺少 1)来调用它。

    \n
  • \n
  • 您转义了$,因此您的变量不会替换。

    \n
  • \n
  • 使用ANSI-C 引用( $\'...\') 将 直接赋值0xAB给变量。

    \n
  • \n
\n
$ PATTERN=$\'\\xAB\'\n$ dd if=/dev/zero count=1 bs=10 | sed "s/\\x0/${PATTERN}/g"\n1+0 records in\n1+0 records out\n10 bytes copied, 7,784e-05 s, 128 kB/s\n\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\n
Run Code Online (Sandbox Code Playgroud)\n

或者,更改您的引用:

\n
PATTERN=xAB\ndd if=/dev/zero count=1 bs=10 | sed \'s/\\x0/\\\'"${PATTERN}"\'/g\'\n
Run Code Online (Sandbox Code Playgroud)\n

或者用第二个反斜杠转义反斜杠:

\n
PATTERN=xAB\ndd if=/dev/zero count=1 bs=10 | sed "s/\\x0/\\\\${PATTERN}/g"\n
Run Code Online (Sandbox Code Playgroud)\n