2010-11-18 72 views
-3

可能重复:
perl + one line smart perl command, in place grep to match unusual characters + full matchperl的一条线+精确匹配

艾都

我需要准确的参数字符串用下面的Perl行匹配:

cat file | perl -nle 'print if /\Q$ENV{PARAMETER}/' 

如下面的例子,显示了下来

我尽力配合:NODE_NAME

,但我得到的所有节点名称的组合名称从文件,

同有关1.1.1。和host_1.A等...

如何完全匹配以下参数?从文件 ,需要改变我的Perl语法才能给出正确的匹配?

more file 
param1=uplicateParam node_name 
param2=a anode_name 
param3=bnode_name 
param4node_name 
param5=1.node_name 
param6=11.11.11.11 
param7=1.1.1.11 
param8=[1234] 
param9=* * * [@] 
param10=11.1.1.11 
param11=host_1.A 
param12=old.host_1.A 


example1 

PARAMETER=node_name 
export PARAMETER 
cat file | perl -nle 'print if /\Q$ENV{PARAMETER}/' 

DuplicateParam node_name 
a anode_name 
bnode_name 
node_name 
1.node_name 


Example2 


PARAMETER=1.1.1.1 
export PARAMETER 
cat file | perl -nle 'print if /\Q$ENV{PARAMETER}/' 

param7=1.1.1.11 
param10=11.1.1.11 

example3 

PARAMETER=host_1.A 
cat file | perl -nle 'print if /\Q$ENV{PARAMETER}/' 
export PARAMETER 

host_1.A 
old.host_1.A 
+0

无法复制,因为这个问题是关于perl匹配,第二我没有得到答案,第三我必须给更多的例子 – jon 2010-11-18 06:27:50

回答

0

这怎么行:

param2=a anode_name 

被grepped为node_name产量a anode_name

,而这条线:

param7=1.1.1.11 

被grepped为1.1.1.1产量param7=1.1.1.11

在我看来,要么首先应产生param2=a anode_name或第二应该产生1.1.1.11

+0

对不起,这不是答案, – jon 2010-11-18 06:28:52

+0

@rster - 什么需要改变我的Perl语法,以便给出正确的匹配? – jon 2010-11-18 06:30:57

+0

@jon,我知道这不是答案,因为你要求相互矛盾的输出。我个人认为,如果(/^param \ d + =(。*($ ENV {PARAMETER})。*)/' – tster 2010-11-18 06:34:51

0

你应该尽量把单词边界(\b)BTO正好匹配:

cat file | perl -nle 'print if /\b\Q$ENV{PARAMETER}\b/' 
+1

'应该打印$ 1'用'\ b'指定的边界常常无法做到[大多数人认为他们](http://stackoverflow.com/questions/4213800/is-there-something-like-a-counter-variable-in-regular-expression-replace/4214173#4214173)。 – tchrist 2010-11-18 13:31:13

0
perl -nlE 'say if /\Aparam\d+=\Q$ENV{PARAMETER}\E\s*\z/' file