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

I'm new to perl so I may have made a mistake. Here are two examples of the strings I want to delete

{ Programa 1.2.3 64-bit 2dat: }

{ Programb 10.1.2.3 64-bit 1dat: }

Also sometimes there are no spaces between the braces like {Programa 1.2.3 64-bit 2dat:}, { Programa 1.2.3 64-bit 2dat:} and {Programa 1.2.3 64-bit 2dat: }. Does this make a difference to the code?

It would be good to get rid of both strings in one script. I'm using Perl version 5.24.1.

Update: After doing some reading, I have now tried s/.*\K\{\s*Name.*\}//s; and that seems to work with spaces/no spaces with the {}. I still don't know how to use one script to remove two or more strings like { Programa 1.2.3 64-bit 2dat: } and { Programb 10.1.2.3 64-bit 1dat: }.

Thanks.

  • Comment on Re^4: Delete a string possibly over two lines

Replies are listed 'Best First'.
Re^5: Delete a string possibly over two lines
by tybalt89 (Monsignor) on Feb 06, 2018 at 09:54 UTC
    #!/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.

      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:  <%-{-{-{-<