With this win South Africa have kept alive their hopes of securing a semifinal berth having won one match of the two they have played so far and another match against Pakistan still to come, while Sri Lanka's challenge of making the semifinals is all but over.
Set a target of 220 for victory, the Sri Lankan batsmen caved in meekly for 141 in 39.1 overs with Shaun Pollock leaading the South African charge taking two for 21 in his 10 overs and then assisting in the run out of Sri Lankan captain Mahela Jayawardene.
Beginning their chase, the Sri Lankans were immediately put on the back foot with Pollock removing Sanath Jayasuriya and Kumar Sangakkara, while Ntini removed the in-form Tharanga to leave them gasping at 23 for 3.
Soon it became 34 for four when Atapattu was beaten by sheer pace from Andre Nel to see his off stump go cartwheeling.
Jayawardene and Dilshan then tried a minor repair job and just when the two looked to have settled down to play a big innings, having added 44 runs for the fifth wicket, a terrible mix up saw Jayawardene being run out for 36.
Though Dilshan stayed on playing some attractive shots the Sri Lankans folded up for 141 runs.
Earlier, South Africa after being put into bat by Jayawardene, were sustained by a fine 54 by AB de Villiers and some late order hitting by Shaun Pollock and Robin Peterson taking them to a respectable total of 219 for nine in their 50 overs.
Lasith Malinga with 4-53, including two wickets in two balls and Chaminda Vaas with 2-16 in his ten overs were the bowling stars for the Lankans.