perl + one line smart perl命令,用于匹配异常字符+完全匹配的grep

时间:2010-11-17 19:19:47

标签: perl

主题:一行智能perl命令就位了简单的grep(在bash脚本中)

当我使用grep匹配不寻常的字符时我遇到了问题(我不能在每个不寻常的字符之前加上“\”,因为它非常有问题而且不是智能解决方案

我需要perl一行语法,它完全匹配$ Some_string示例中定义的所有不可用字符

 Examples


 Some_string="[234-094]"
 Some_string="[ * ( & % @ !]"
 Some_string="~ [ 0:3 # % & ^ + =]"
 Some_string="1.1.1.1.-9.9.9.9   + 9999.999.1 – 10000"
 Some_string="< { [ ' : ; " ? / . , "
 Some_string="PORT.A.B.C.D – 124.543.455.33 – [ ! NOT EQUAL PORT 38737 – 3837652"
 .
 .
 .

我的坏grep语法

 cat  file | grep $Some_string

使用perl(需要以下正确的建议/解决方案)

 cat file | perl -nle 'print if /$Some_string/'

规则:

备注:如果Some_string =“111.111.111.111”         在文件中我有1111.1111.1111.1111         然后perl语法需要忽略这一点。         perl必须匹配,只有我在文件中:111.111.111.111。

秒备注:如果Some_string =“WORD”             在我的文件中:ONEWORD             然后perl语法需要忽略这一点             perl必须匹配,只有我在文件中:WORD

3 个答案:

答案 0 :(得分:2)

我不确定我完全理解你的问题。也许-P-x可以执行您想要的操作,并引用"$Some_string"来保留空格?

grep -Px "$Some_string" file

从grep手册页:

  

-P--perl-regexp

     

将PATTERN解释为Perl正则表达式。

     

-x--line-regexp

     

仅选择与整行完全匹配的匹配项。

答案 1 :(得分:0)

你必须以某种方式逃避字符串。在这种情况下,需要使用\来转义特殊字符,因为将字符串传递给perl与将其传递给grep没什么不同 - 两者都会在shell处理后看到字符串。

使用perl执行此操作只会模糊代码。

答案 2 :(得分:0)

你可以这样做:

perl -nE'say if m|\Q[ * ( & % \E\@\Q !]\E|' file

我在这里找到了\ Q和\ E运算符: http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators

该链接的摘录:

  

您不能在\ Q序列中包含文字$或@。未转义的$或@插入相应的变量,而转义将导致插入文字字符串\ $。你需要写一些像m / \ Quser \ E \ @ \ Qhost /.

这样的东西