Jussi Piitulainen writes: > Daniel Fetchinson writes: > > > This question is really about sed not python, hence it's totally > > off. But since lots of unix heads are frequenting this list I > > thought I'd try my luck nevertheless. > ... > > using python. The pattern is that the first line is deleted, then 2 > > lines are kept, 3 lines are deleted, 2 lines are kept, 3 lines are > > deleted, etc, etc. > > > > But I couldn't find a way to do this with sed and since the whole > > operation is currently done with a bash script I'd hate to move to > > python just to do this simple task. > > > > What would be the sed equivalent? > > The following appears to work here. Both parts of the address are > documented as GNU extensions in the man page: 2~5 matches line 2 and > then every 5th line, and ,+1 tells sed to match also the 1 line after > each match. With -n, do not print by default, and p is the command to > print when an address matches. > > sed -n '2~5,+1 p' > > Tried with GNU sed version 4.1.2, never used sed this way before. > > So, is there some simple expression in Python for this? Just asking > out of curiosity when nothing comes to mind, not implying that there > should be or that Python should be changed in any way.
To expand, below is the best I can think of in Python 3 and I'm curious if there is something much more concise built in that I am missing. def sed(source, skip, keep, drop): '''First skip some elements from source, then keep yielding some and dropping some: sed(source, 1, 2, 3) to skip 1, yield 2, drop 3, yield 2, drop 3, ...''' for _ in range(0, skip): next(source) while True: for _ in range(0, keep): yield next(source) for _ in range(0, drop): next(source) -- http://mail.python.org/mailman/listinfo/python-list