$ echo "a+b=b&c=hoge&d=hfua piyo" | jq -R '[split("&")[] | ([split("=")[] | @uri] | join("="))] | join("&")' "a%2Bb=b&c=hoge&d=hfua%20piyo"
jq
には @uri
で URLエンコーディングする機能がある。
& で split して、= でさらに split して、片っ端から @url して、 = と & で join し直す、という仕組み。
もうちょっとシンプルに出来そう。