Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Delete a string possibly over two lines

by tybalt89 (Monsignor)
on Feb 06, 2018 at 04:41 UTC ( [id://1208528]=note: print w/replies, xml ) Need Help??


in reply to 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\{ Name.*\}//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} { 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.

Outputs:

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 . 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 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^2: Delete a string possibly over two lines
by AnomalousMonk (Archbishop) on Feb 06, 2018 at 06:29 UTC
    s/.*\K\{ Name.*\}//s;

    I don't understand the purpose of the  .*\K sub-expression in this substitution. Is it perhaps intended as a defensive measure against nested  { ... } groups? I suppose the thing to do is play around with it a bit, but I don't have time ATM. Could you please comment on this?


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

      Yes, it is defense against nested (or only "first half of") expressions.

Re^2: Delete a string possibly over two lines
by texuser (Novice) on Feb 06, 2018 at 05:00 UTC

    Thank you for your quick response and code. It get rids of the string but leaves things like { } after it runs. Is there a way to remove the enclosing brackets as well? I probably wasn't clear that I wanted to delete them as well.

    Also if there are other strings with similar patterns in the file, like { AnotherName 4.5.6 xxx xxxx}, do I have to write separate perl scripts or can I do it all in one script?

    Thanks again.

      ... if there are other strings with similar patterns in the file, like { AnotherName 4.5.6 xxx xxxx}, do I have to write separate perl scripts ...

      Ah, what's in a name? A set of names could be defined as
          my $name = qr{ \b (?: Phil | Bob | Hal) \b }xms;
      and used in tybalt89's substitution statement as
          s/.*\K\{ $name.*\}//s;
      (untested). However, you have to define what constitutes a "name".

      Update 1: Similarly, a "dotted decimal" regex could be defined that would match any dotted decimal (with optional embedded whitespace), some subset, or... For instance (also untested):

      my $dotted_decimal = qr{ (?<! \d) \d+ (?: \s* [.] \s* \d+){2,3} (?! \d) }xms;
      This can, I think, be broken over arbitrary lines. Again, you must decide what is needed in your application.

      Update 2: I've changed the  $dotted_decimal definition above to conform to the expanded specification examples provided here: counted quantifier  {2} changed to  {2,3} instead (and it's still untested).


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

      No, it does not leave { } in the output. Did you mis-copy it?

      Looks like you are changing the spec. Please give exact definition of "other strings with similar patterns".

        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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1208528]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (4)
As of 2024-04-24 03:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found