in reply to Re^4: Delete a string possibly over two lines
in thread Delete a string possibly over two lines

#!/usr/bin/perl # http://perlmonks.org/?node_id=1208527 use strict; use warnings; local $/ = '}'; # use } as line terminator... while(<DATA>) { s/.*\K\{\s*(?:Name|Program).*\}//s; print; } __DATA__ { Name 1.2.3 xxxx xxxxx} where xxxx and xxxxx could be a-z, 0-9 or : (a single colon). There could be one or more spaces after { and before the } and there c +ould be one or more spaces between the groups in the string. Also the + string could be split over two lines like { Name 1.2.3 xxxx xxxxx } { Name 1.2. 3 xxxx xxxxx} { Programa 1.2. 3 xxxx xxxxx} { Programb 1.2. 3 xxxx xxxxx} { Name 1.2.3 xxxx xxxxx }. So it could be split at a space or after a dot. There could be one or +more spaces at the end of the split line before the newline like this { Name 1.2.3\ \ \ \ xxxx } where I use \ to denote a space. My question is how do I get rid of all these strings in a file. I'm us +ing Perl under Windows 10 if that helps. Thanks.

Replies are listed 'Best First'.
Re^6: Delete a string possibly over two lines
by texuser (Novice) on Feb 07, 2018 at 02:57 UTC

    Thanks that worked. If I may ask one final question. How do I run the script on an input file say infile and output to a file outfile (these file names could change from run to run) without appending the infile to the code you provided? Alternatively can I make the changes using a suitable command line that does what the script does instead of using the script?

    Thanks.

      I will take the liberty of answering your "final question" for tybalt89.

      How do I run the script on an input file say infile and output to a file outfile ... without appending the infile [data] to the code you provided?

      Questions of doing "real" file I/O are addressed by various links within these two posts, which have answers that use "integrated" data (update: or maybe "inline" data would be a better description) to support their examples and which the OPer also wanted to convert to general file I/O.

      ... can I make the changes using a suitable command line that does what the script does instead of using the script?

      That's two questions. Ok, try this. Caution: This is untested: Don't test it on any file you can't afford to say goodbye to. Assuming that you know the actual substitution you want and that this is intended for the Windows command line:
          perl -pe "BEGIN { $/ = '}' } s/.*\K\{\s*(?:Name|Program).*\}//s" infile > outfile
      See perlrun for Perl command line switches. Good luck.

      Update: Just tested it a little, and the BEGIN-block should be  BEGIN { $/ = '}' } (was  BEGIN { $\ = $/ = '}' } — fixed). But more testing is still needed!


      Give a man a fish:  <%-{-{-{-<

        Thank you. Your one line solution works fine.