... 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: <%-{-{-{-<
| [reply] [d/l] [select] |
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".
| [reply] |
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.
| [reply] |
#!/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.
| [reply] [d/l] |