On 4/25/05, Kevin Horton <[EMAIL PROTECTED]> 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).
> 
> 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.


-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
> 
> 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?
> 

Yes it will.


HTH,

--jay

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to