Wiaan Mulder excelled in the first session of play, taking two wickets to help the Proteas edge closer to victory.
Sri Lanka came into the fourth day under pressure, trailing by 160 runs, and they did their cause no favours by losing five wickets in the morning session.
It wasn’t a flawless effort from the Proteas though. Of the seamers, all but Mulder were consistent with the ball, often bowling too short to trouble the Sri Lankan batsman.
Kusal Perera was particularly brutal on this line of attack, throwing his hands at the ball and moving to his half century in quick time.
Mulder showed the way and was rewarded for pitching it up. He grabbed two wickets in this fashion, the first ripping back to bowl Dinesh Chandimal, while Niroshan Dickwella knicked off.
The dangerous Perera remained the prized wicket. He was dropped on 52 by Quinton de Kock, but that wasn’t significant, as Anrich Nortje brushed his edge just 11 runs later.
Lutho Sipamla then knicked off Dasun Shanaka and Vishwa Fernando was run out just before lunch was called to leave Sri Lanka reeling at 148/7, still trailing by 77 runs.
Proteas: Aiden Markram, Dean Elgar, Rassie van der Dussen, Faf du Plessis, Quinton de Kock (c) (wk), Temba Bavuma, Wiaan Mulder, Keshav Maharaj, Anrich Nortje, Lungi Ngidi, Lutho Sipamla.
Sri Lanka: Dimuth Karunaratne (C) KJ Perera, Kusal Mendis, Dinesh Chandimal, Dhananjaya de silva, Niroshan Dickwella (wk), Dasun Shanaka, Wanindu Hasaranga, Vishwa Fernando, Kasun Rajitha, Lahiru Kumara.