World number ones South Africa, who are eliminated, suffered three run-outs in a collapse of eight wickets for 51 runs to be bowled out for 191.
Shikhar Dhawan made 78 and Virat Kohli 76 not out as India raced to their target with 12 overs to spare.
India join England and Bangladesh in the last four, with Sri Lanka meeting Pakistan on Monday for the final spot.
It would take a dramatic swing in net run-rate for India to be toppled as Group B leaders, so they are likely to play Bangladesh at Edgbaston on Thursday. England are already guaranteed to play in the first semi in Cardiff on Wednesday.
Though South Africa go out, they remain in England for three Twenty20 internationals, followed by a four-Test series.
Despite having four batsmen inside the top 10 of the world ODI rankings, South Africa could only muster 219-8 in their defeat by Pakistan last Wednesday. This, though, was a greater implosion - comical, calamitous and self-inflicted.
Firstly AB de Villiers failed to beat Hardik Pandya’s throw from point to depart with a tournament total of 20 runs.
De Villiers was running with Faf du Plessis who, five balls later, was involved in a farcical mix-up with David Miller that ended with both men striving to make ground at the striker’s end as the bails were removed at the non-striker’s. The third umpire adjudged Miller as the man out.
Fittingly, a run-out completed the collapse. Imran Tahir and JP Duminy met in the middle of the pitch, with Tahir’s turn and dive unable to save him.