C, 62 bytes
f(char*s){for(;*s;)*++s-32&&*s||(s[-1]^=s[-2]^=s[-1]^=s[-2]);}
Recursive version (62 bytes):
f(char*s){*++s-32&&*s||(s[-1]^=s[-2]^=s[-1]^=s[-2]);*s&&f(s);}
f(char*s){for(;*s;)*++s-32&&*s||(s[-1]^=s[-2]^=s[-1]^=s[-2]);}
Recursive version (62 bytes):
f(char*s){*++s-32&&*s||(s[-1]^=s[-2]^=s[-1]^=s[-2]);*s&&f(s);}