You can't really do it without some kind of preprocessing step -- either authoring the original sprites so they have the desired effect, or including some extra information along with each sprite about pixel "depths" and normal information, essentially turning your 2D sprite into a 3D-ish data structure.
The cel shading effect is designed to make 3D art look like hand-drawn 2D art. It works with the principle of color quantization, most of the time -- mapping a smooth continuous input range into one of N discrete color buckets. Usually the diffuse term of your lighting equation -- the "n-dot-l" term, or the dot product between a vertex normal and the light vector -- is used at the input because this will range smoothly from 0 to 1. You can use this as input to a 1D texture read where the texture contains information about the actual color to apply. It usually is just a band of a small number of discrete colors.
Obviously this will be hard to do without that input value, and without encoding additional information -- such as pixel normals or depth (with which you could in theory reproduce the normals at runtime) -- into the sprite you won't have any meaningful data to use as the input. Unless your sprites are being authored in a 3D modelling program where you might be able to write some export script for producing the final renders with encoded normal information (like a normal map, essentially), you are likely better off just drawing the sprites to look the way you want.
The closest you could probably get would be to write a shader that maps the [0..1] range of every color component into one of a fixed set of buckets -- say 0, 0.25, 0.5, 0.75 and 1. This could be done independently for each component or on a global basis. It essentially massively reduces the color space available to your sprites, which is more-or-less what cel shading does. But unless your sprites are authored to account for this it's entirely possible that you will spend hours tweaking the mapping and still end up with sprites that look hideous in practice.
A render effect that is typically applied with cel shading is feature edge detection and rendering -- "outline" rendering. It would be possible to do this with 2D sprites, but you'd only get the outlines of the sprites and no interior feature edges, which does not look nearly as good. Once again, to achieve a better effect you'd be preprocessing the sprite data or just authoring the edges directly into the sprite images.