Code Comments
Programming Forum and web based access to our favorite programming groups.I'm trying to write a perl one-liner that will edit an iCalendar format file to remove To Do items. The file contains several thousand lines, and I need to remove several multi-line blocks. The blocks to remove start with a line "BEGIN:VTODO" (without the quotes) and end with a line "END:VTODO" (also without quotes). I've tried the following one-liner, perl -p -i.bak -e 's/BEGIN:VTODO.*END:VTODO//sg' file_name_to_edit The .bak file is created, which tells me the one-liner is finding my file, but the file is identical to the old one - i.e. the regex doesn't seem to be matching anything. I'm also wondering whether my proposed one-liner (if it worked) would be too greedy. Would it pull out everything between the first BEGIN:VTODO and the last END:VTODO? I'd appreciate any hints. Thanks, Kevin Horton
Post Follow-up to this messageHi Kevin just hints, no solution :-) Am Montag, 25. April 2005 12.59 schrieb Kevin Horton: > I'm trying to write a perl one-liner that will edit an iCalendar > format file to remove To Do items. The file contains several > thousand lines, and I need to remove several multi-line blocks. The > blocks to remove start with a line "BEGIN:VTODO" (without the quotes) > and end with a line "END:VTODO" (also without quotes). > > I've tried the following one-liner, > > perl -p -i.bak -e 's/BEGIN:VTODO.*END:VTODO//sg' file_name_to_edit according to perldoc perlrun, -p reads _one_ line after the other, so you can't search for multiline patterns this way. > The .bak file is created, which tells me the one-liner is finding my > file, but the file is identical to the old one - i.e. the regex > doesn't seem to be matching anything. > > I'm also wondering whether my proposed one-liner (if it worked) would > be too greedy. yes or no, depends from the working implementation :-) > Would it pull out everything between the first > BEGIN:VTODO and the last END:VTODO? yes, if you try to match a string with the whole file in it with the regex above. > > I'd appreciate any hints. > > Thanks, > > Kevin Horton
Post Follow-up to this messageOn 4/25/05, Kevin Horton <khorton01@rogers.com> wrote: > I'm trying to write a perl one-liner that will edit an iCalendar > format file to remove To Do items. The file contains several > thousand lines, and I need to remove several multi-line blocks. The > blocks to remove start with a line "BEGIN:VTODO" (without the quotes) > and end with a line "END:VTODO" (also without quotes). >=20 > I've tried the following one-liner, >=20 > perl -p -i.bak -e 's/BEGIN:VTODO.*END:VTODO//sg' file_name_to_edit >=20 > The .bak file is created, which tells me the one-liner is finding my > file, but the file is identical to the old one - i.e. the regex > doesn't seem to be matching anything. -p causes the file to be read one line at a time, which negates the usefulness of /s. If you have sufficient RAM to read the entire file into memory, you can use the -0 option to "slurp" the file: perl -0777 -p -i.bak -e 's/BEGIN:VTODO.*?END:VTODO//sg' see perldoc perlrun for details >=20 > I'm also wondering whether my proposed one-liner (if it worked) would > be too greedy. Would it pull out everything between the first > BEGIN:VTODO and the last END:VTODO? >=20 Yes it will. HTH, --jay
Post Follow-up to this message> I'm trying to write a perl one-liner that will edit an iCalendar > format file to remove To Do items. The file contains several > thousand lines, and I need to remove several multi-line blocks. The > blocks to remove start with a line "BEGIN:VTODO" (without the quotes) > and end with a line "END:VTODO" (also without quotes). >=20 > I've tried the following one-liner, >=20 > perl -p -i.bak -e 's/BEGIN:VTODO.*END:VTODO//sg' file_name_to_edit Assuming you have enough disk space: perl -ane 'print unless /^BEGIN:VTODO/ .. /^END:VTODO/' old > new perldoc perlrun for more info on perl's command line paramaters
Post Follow-up to this messageOn 25-Apr-05, at 10:06 AM, Jay Savage wrote: > On 4/25/05, Kevin Horton <khorton01@rogers.com> wrote: > > > -p causes the file to be read one line at a time, which negates the > usefulness of /s. If you have sufficient RAM to read the entire file > into memory, you can use the -0 option to "slurp" the file: > > perl -0777 -p -i.bak -e 's/BEGIN:VTODO.*?END:VTODO//sg' This seems to work perfectly. I've studied the output for five minutes, and can't find a problem. Thank you very much. > > see perldoc perlrun for details I've learned a lot in the last few minutes, now that I know which of the perldoc files to look in. > > Yes it will. I looked at trying to use the "?" to stop the potential greedyness, but I didn't grok how it worked. Now that I have an example, I think I understand it (again, as I thought I understood when I was first puzzling through perl on vacation in Christmas 2003). Hopefully my understanding this time is more lasting. :) Thanks so much to the several people who responded. Kevin Horton Ottawa, Canada RV-8 - Finishing Kit http://www.kilohotel.com/rv8
Post Follow-up to this messageOn 25-Apr-05, at 10:06 AM, Jay Savage wrote: > On 4/25/05, Kevin Horton <khorton01@rogers.com> wrote: > > > -p causes the file to be read one line at a time, which negates the > usefulness of /s. If you have sufficient RAM to read the entire file > into memory, you can use the -0 option to "slurp" the file: > > perl -0777 -p -i.bak -e 's/BEGIN:VTODO.*?END:VTODO//sg' This seems to work perfectly. I've studied the output for five minutes, and can't find a problem. Thank you very much. > > see perldoc perlrun for details I've learned a lot in the last few minutes, now that I know which of the perldoc files to look in. > > Yes it will. I looked at trying to use the "?" to stop the potential greedyness, but I didn't grok how it worked. Now that I have an example, I think I understand it (again, as I thought I understood when I was first puzzling through perl on vacation in Christmas 2003). Hopefully my understanding this time is more lasting. :) Thanks so much to the several people who responded. Kevin Horton Ottawa, Canada RV-8 - Finishing Kit http://www.kilohotel.com/rv8
Post Follow-up to this message
Show a Printable Version
Email This Page to Someone!
Receive updates to this thread
Powered by vBulletin
Copyright 2000-2006 Jelsoft Enterprises Limited.