South Africa's Anrich Nortje took the vital wickets of captain Joe Root and talisman Ben Stokes as England struggled to 262 for nine at stumps on the first day of the second test on Friday.
Pace bowler Nortje, playing his fourth test, finished with 2-54 off 17 overs as the home side restricted the tourists on a Newlands wicket that was expected to be full of runs.
A late cameo from Ollie Pope, one of three changes to the touring side's line-up after they lost the first test by 107 runs, lifted England's gloom slightly as he defied the second new ball to finish unbeaten on 56.
"It's a good wicket but there is something there for the seamers, so we'll see how it pans out in the next two days," said Pope, who was caught in the deep in the penultimate over of the day but earned a reprieve when Kagiso Rabada's delivery proved to be a no-ball.
The rest of England's top batsmen contrived to get themselves out when they looked set for lengthy spells at the crease with Stokes dismissed for 47 and Root 35.
Joe Denly contributed 38 and Dom Sibley 34 but it is the home side who will be more satisfied after England won the toss.
They lost Zak Crawley (4) in the third over as he edged Vernon Philander to wicketkeeper Quinton de Kock.
The 21-year-old was making his second test appearance after being brought in to replace the injured Rory Burns, who hurt his ankle playing soccer on Thursday in the latest setback for England on a calamity-filled tour.
Sibley was also snagged behind off Rabada just before lunch followed, in the afternoon session, by Root, caught off his gloves as he ducked into a vicious bouncer.
Denly was bowled by a full delivery from spinner Keshav Maharaj and Stokes, who hit a career-high 258 at the picturesque Cape Town ground four years ago, was beginning to look dangerous when he chipped to Dean Elgar at extra cover.
The sloppy shot left Stokes covering his face in disbelief before trudging off.
Jos Buttler (29) threatened a counter-attack before Dwaine Pretorius halted his progress and then bowled Sam Curran and Dom Bess was out first ball off the first delivery with the second new ball from Philander as De Kock took a fifth catch.
"We stuck to our disciplines, so it was a pretty good day. We can run with that," Pretorius said.
A yorker from Rabada accounted for Stuart Broad but Pope attacked the new ball to add an unbeaten 28 runs for the last wicket with James Anderson, who will resume on three not out.