Left-arm spinner Keshav Maharaj took three wickets for 21 runs in 10 overs and recalled all-rounder Chris Morris three for 38 in 8.5 overs.
England captain Joe Root top-scored with 78 in an innings where Yorkshire team-mate Jonny Bairstow (45) was the only other batsman to make more than 30.
South Africa's performance was all the more impressive as they were without Kagiso Rabada.
The fast bowler was suspended from this match after swearing at Ben Stokes during England's 211-run win in the first of a four-match series at Lord's last week.
South Africa were 75 for one in their second innings, a lead of 205 runs, at stumps on the second day of the second Test against England at Trent Bridge on Saturday.
Dean Elgar was 38 not out and Hashim Amla 23 not out.
England lead the four-match series 1-0 after a 211-run victory in the first Test at Lord's last week.
Chris MorrisEngland vs South AfricaEngland vs South Africa 2017Joe RootJonny Bairstowkeshav maharajmorne morkel
First Published: July 15, 2017, 11:15 PM IST