#!/bin/sed -f ############################# # Fixed XOR in sed # # (c) Mariusz Wołoszyn 2014 # ############################# N s/ //g /^[0-9a-zA-Z]\+\n[[0-9a-zA-Z]\+$/! { i\ ERROR: WRONG INPUT DATA d q } s/$/\n\n/ h :HEX2BIN1 s/^\(.*\)\(.\)\n.*\n.*\n.*$/\2/ s/$/;0=00001=00012=00103=00114=01005=01016=01107=01118=10009=1001a=1010b=1011c=1100d=1101e=1110f=1111A=1010B=1011C=1100D=1101E=1110F=1111/ s/\(.\);[^;]*\1=\(....\).*/\2/g H g s/^\(.*\).\n\(.*\)\n\(.*\)\n\(.*\)\n\(.*\)/\1\n\2\n\5\3\n\4/ /^.\{0\}\n/ { h b HEX2BIN2 } h b HEX2BIN1 :HEX2BIN2 s/^.*\n\(.*\)\(.\)\n.*\n.*$/\2/ s/$/;0=00001=00012=00103=00114=01005=01016=01107=01118=10009=1001a=1010b=1011c=1100d=1101e=1110f=1111A=1010B=1011C=1100D=1101E=1110F=1111/ s/\(.\);[^;]*\1=\(....\).*/\2/g H g s/^\(.*\)\n\(.*\).\n\(.*\)\n\(.*\)\n\(.*\)/\1\n\2\n\3\n\5\4/ /^\n.\{0\}\n/ { s/\n\n\(.*\)\n\(.*\)/\1\n\2/ b XOR } h b HEX2BIN2 :XOR s/$/\n/ :XORLOOP s/^\(.*\)\(.\)\n\(.*\)\(.\)\n\(.*\)$/\1\n\3\n\5\n\2\4/ h s/^.*\n.*\n.*\n\(..\)$/\1/ s/$/;00=001=110=111=0/ s/^\(..\)[^;]*;[^;]*\1=\(.\).*/\2/ H g s/^\(.*\)\n\(.*\)\n\(.*\)\n..\n\(.\)$/\1\n\2\n\4\3/ /^\([0]*\)\n\([0]*\)\n/ { s/^.*\n.*\n\(.*\).*/\1/ b BIN2HEX } s/^\n\([01]\+\)\n\(.*\)/0\n\1\n\2/ s/^\([01]\+\)\n\n\(.*\)/\1\n0\n\2/ b XORLOOP :BIN2HEX s/$/\n/ h :BIN2HEXLOOP s/^\(.*\)\(....\)\n\(.*\)$/\2/ s/$/;0000=00001=10010=20011=30100=40101=50110=60111=71000=81001=91010=a1011=b1100=c1101=d1110=e1111=f/ s/\(....\);[^;]*\1=\(.\).*/\2/g H g s/^\(.*\)....\n\(.*\)\n\(.*\)/\1\n\3\2/ s/^\(...\)\n/0\1\n/ s/^\(..\)\n/00\1\n/ s/^\(.\)\n/000\1\n/ /^.\{0\}\n/ { s/^\n\(.*\)/\1/g q } h b BIN2HEXLOOP q