Search code examples
bashvariablessedencodingbusybox

How to use ANSI-C Quoting with Shell variables?


I have a sed command with hex replacement, which i used in Busybox: ( BusyBox v1.32.1 (2022-03-05 22:56:19 CET) multi-call binary.)

This works on other Linux environments:

HEXCODE=34
sed "s/\xa1\xb2/\x12\x$HEXCODE/g" < file.bin > file2.bin

On my busybox sed environment it doesn't.

This works fine with Ansi Encoding string:

This works:

sed $'s/\xa1\xb2/\x12\x34/g' < file.bin > file2.bin

But i want this here with Shell variable use:

HEXCODE=34
sed $'s/\xa1\xb2/\x12\x$HEXCODE/g' < file.bin > file2.bin

This doen't work for me, so can I get some help here?

Edit:

pynexj's tipps helps here with eval / printf: Just need this oneliner here:

But i want this here with Shell variable use:

HEXCODE=34
eval sed "\$'s/\xa1\xb2/\x12\x$HEXCODE/g'" < file.bin > file2.bin

Solution

  • You can use printf or eval. See the following example:

    [bash-5.1] $ cat foo.sh
    s='hello world'
    
    HEX=4c  # 'L'
    
    # use `printf'
    cmd=$( printf "s/l/\x$HEX/g" )
    echo "$s" | busybox sed -e "$cmd"
    
    # use `eval'
    eval cmd="\$'s/l/\x$HEX/g' "
    echo "$s" | busybox sed -e "$cmd"
    [bash-5.1] $ busybox sh foo.sh
    heLLo worLd
    heLLo worLd