$ sed '/abstract = .*},$/d; /abstract = /,/},$/d' <file
@article{ginsberg_lifespan_2018,
title = {On the lifespan of three-dimensional abstract gravity water waves with vorticity},
language = {en},
urldate = {2018-12-05},
author = {Ginsberg, Daniel},
month = dec,
year = {2018}
}
@article{higaki_two-dimensional_2017,
title = {On the two-dimensional steady {Navier}-{Stokes} equations related to flows around a rotating obstacle},
journal = {arXiv:1703.07372 [math]},
author = {Higaki, Mitsuo and Maekawa, Yasunori and Nakahara, Yuu},
month = mar,
year = {2017},
note = {arXiv: 1703.07372},
keywords = {Mathematics - Analysis of PDEs}
}
This first tries to delete a complete single line abstract entry, and if that does not work, tries to delete a multi-line abstract entry.
A multi-line entry is a set of lines from a line containing abstract = to the next line that ends with },.
Annotated sed script:
/abstract = .*},$/d # delete complete abstract line, skip to next input line
/abstract = /,/},$/d # delete multi-line abstract entry
If you need to be more specific with the start string, you could use, for example, ^[[:blank:]]*abstract instead of the abstract bit of those expressions. This would allow for only spaces or tabs to precede the abstract = on those lines.