Wiaan Mulder took three wickets in the opening session as Sri Lanka made it to lunch on day one of the second Test on 84-5.
Dimuth Karunaratne won the toss and elected to bat first on Sunday morning with the visitors hoping to respond from their defeat at SuperSport Park.
Opener Kusal Perera raced to a brilliant half-century following the early dismissal of captain Karunaratne, who was caught behind off Anrich Nortje for only two.
Perera went on the attack and wasn’t afraid to put away any over-pitched deliveries. The introduction of Mulder, however, brought about the crucial wicket of the left-hander, caught by Aiden Markram for 60.
Mulder struck again four deliveries later, this time nicking off Kusal Mendis for a duck before the 22-year-old found the edge of Minod Bhanuka for only five.
Nortje then managed to get his second wicket of the innings when Lahiru Thirimanne was caught behind by Quinton de Kock for 17 with the final ball before the break.
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, Lahiru Thirimanne, Kusal Mendis, Minod Bhanuka, Niroshan Dickwella (wk), Dasun Shanaka, Wanindu Hasaranga, Vishwa Fernando, Dushmantha Chameera, Asitha Fernando