shiva1987
shiva1987

Reputation: 115

Perl one-liner: deleting a line with pattern matching

I am trying to delete bunch of lines in a file if they match with a particular pattern which is variable.

I am trying to delete a line which matches with abc12, abc13, etc.

I tried writing a C-shell script, and this is the code:

    **!/bin/csh
    foreach $x (12 13 14 15 16 17)
    perl -ni -e 'print unless /abc$x/' filename
    end**

This doesn't work, but when I use the one-liner without a variable (abc12), it works.

I am not sure if there is something wrong with the pattern matching or if there is something else I am missing.

Upvotes: 9

Views: 15513

Answers (2)

EvilGrayHAM-OP
EvilGrayHAM-OP

Reputation: 9

Try this

perl -n -i.bak -e 'print unless m/abc1[2-7]/' filename

using the range [2-7] only removes the need to type [234567] which has the effect of saving you three keystrokes.

man 1 bash: Pattern Matching

[...] Matches any one of the enclosed characters. A pair of characters separated by a hyphen denotes a range expression; any character that sorts between those two characters, inclusive, using the current locale's collating sequence and character set, is matched. If the first character following the [ is a ! or a ^ then any character not enclosed is matched.

A - may be matched by including it as the first or last character in the set. A ] may be matched by including it as the first character in the set.

Upvotes: -3

Sobrique
Sobrique

Reputation: 53478

Yes, it's the fact you're using single quotes. It means that $x is being interpreted literally.

Of course, you're also doing it very inefficiently, because you're processing each file multiple times.

If you're looking to remove lines abc12 to abc17 you can do this all in one go:

perl -n -i.bak -e 'print unless m/abc1[234567]/' filename

Upvotes: 17

Related Questions