You can use the following trick to swap stdout and stderr. Then you just use the regular pipe functionality.
( proc1 3>&1 1>&2- 2>&3- ) | proc2
Provided stdout and stderr both pointed to the same place at the start, this will give you what you need.
What the x>&y bit does is to change file handle x so it now sends its data to wherever file handle y currently points. For our specific case:
- 3>&1creates a new handle- 3which will output to the current handle- 1(original stdout), just to save it somewhere for the final bullet point below.
- 1>&2modifies handle- 1(stdout) to output to the current handle- 2(original stderr).
- 2>&3-modifies handle- 2(stderr) to output to the current handle- 3(original stdout) then closes handle- 3(via the- -at the end).
It's effectively the swap command you see in sorting algorithms:
temp   = value1;
value1 = value2;
value2 = temp;