Crazy coder
Crazy coder

Reputation: 99

Wild card matching

I need to match a sentences which contains both wild card character \ and . in same sentence.How to do it with Perl?

Say suppose my file has following sentences :

ttterfasghti.
ddseghies/affag
hhail/afgsh.
asfsdgagh/
adterhjc/sgsagh.

My expected output should be :

hhail/afgsh.
adterhjc/sgsagh.

Upvotes: 0

Views: 186

Answers (2)

zdim
zdim

Reputation: 66899

Given a clarification from a comment

Any order but the matching line should contain both / and .

an easy way

perl -wne'print if m{/} and m{\.}' filename

This is inefficient in the sense that it starts the regex engine twice and scans each string twice. However, in most cases that is unnoticable while this code is much clearer than a single regex for the task.

I use {} delimiters so to not have to escape the /, in which case the m in front is compulsory. Then I use the same m{...} on the other pattern for consistency.


A most welcome inquiry comes that this be done in a script, not one-liner! Happy to oblige.

use warnings;
use strict;

my $file = shift || die "Usage: $0 file\n";

open my $fh, '<', $file or die "Can't open $file: $!";

while (<$fh>) {
    print if m{/} and m{\.};
}

close $fh;

Upvotes: 3

Stefan Becker
Stefan Becker

Reputation: 5962

This feels like a duplicate, but I just can't find a good previous question for this.

For / there are two ways:

  • use m// operator with different separator characters, e.g. m,<regex with />,, m{<regex with />}, or
  • escape it, i.e. /\//

For . use escaping.

Note that inside a character class ([...]) many special characters no longer need escaping.

Hence we get:

$ perl <dummy.txt -ne 'print "$1: $_" if m,(\w+/\w*\.),'
hhail/afgsh.: hhail/afgsh.
adterhjc/sgsagh.: adterhjc/sgsagh.

i.e. the line is printed if it contains one-or-more word characters, followed by a /, zero-or-more word characters, ending with a ..

Recommended reading perlrequick, perlretut & perlre.


UPDATE after OP clarified the requirement in a comment:

 $ perl <dummy.txt -ne 'print if m,/, && m{\.}'
 hhail/afgsh.
 adterhjc/sgsagh.

Upvotes: 3

Related Questions