India were 251 for five at lunch, stretching their second innings lead to 129. Skipper Virat Kohli was on 41 with Ravichandran Ashwin yet to score.
The hosts were bowled out for 172 in their first innings at Kolkata’s Eden Gardens, while Sri Lanka, who have never won a Test in India, made 294.
India resumed their second innings on 171-1 Monday and the batsman played positively, going for boundaries, but Lakmal soon bowled Lokesh Rahul for 79 to check the surge.
Lakmal tested the batsmen with his probing line and length and was rewarded with the wicket of Cheteshwar Pujara, who added 20 to his overnight two.
Pujara was taken by surprise by an awkward bouncer and gave a leading edge to gully where Dilruwan Perera took a sensational catch diving forward.
Ajinkya Rahane became Lakmal’s third victim when trapped lbw for a duck as the hosts slipped to 213 for four.
Off-spinner Perera then sent back Ravindra Jadeja for nine.
Kohli, after a tentative start, remained solid during his 71-ball stay.
India’s 166-run opening stand between Rahul and Shikhar Dhawan, who made 94, enabled them to bounce back after conceding a 122-run first innings lead on day four of the rain-affected match, the first in a three-Test series.