主题:一行智能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
答案 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 /.
这样的东西