"Matt Herzog" <[email protected]> wrote

I can't help wondering how to do this in python:

perl -wnl -e '/string/ and print;' filename(s)

The first thing to say is that python is not Perl so there will be things Perl does more easily than Python and vice versa. (For example Pythons intersactive mode is miles better than perls "read from stdin" mode) Perl is better than python for quick n dirty one liners, no question. And for every Perl one liner there will be a relatively short script that can be written. But you will probably be as well using Perl for those - its not a bad thing to know and use more than one language, quite the opposite.

Not that I want to forget the precious few bits of Perl I do know,

but I'd rather be totally reliant on python for such tasks.

Why? I'd hate to be totally reliant on any one language for anything
Whether it be Python, Lisp, C or assembler!

To answer your question I think the answer to your one liner would look something like:

import fileinput   # for iterating over several files

for line in fileinput.input(inplace=1):  # files = argv[1:]
try: line.replace('string', 'edit')
       print line
   except IOError:
       continue    # ignore bad filenames

This also should help the OP answer his question about how to generate filenames, line numbers etc - use fileinput and the filename(), filelineno() etc functions...

Not as short as Perl but more maintainable.

If you really must do a one liner its probably possible although it will be longer in Python, but I'm not even going to attempt it - thats what awk/perl are there for!

HTH,

--
Alan Gauld
Author of the Learn to Program web site
http://www.freenetpages.co.uk/hp/alan.gauld

_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to