2012-07-28 32 views
0

我正在寻找其中有撇号的线条,并尝试了一些看起来与我完全相同的表达方式;然而,有些人工作,其他人没有。为什么我会得到以下行为:这些正则表达式为什么不同?

egrep \' file  # works as expected 

egrep "\'" file # seems to return all lines 

egrep "[\']" file # works as expected 

egrep '\'' file # seems to be waiting for more input 

回答

5

单引号对双引号在转义方面存在差异。把echo在前面看到什么是真正被发送到egrep

$ echo egrep \' file 
egrep ' file 
$ echo egrep "\'" file 
egrep \' file 
$ echo egrep "[\']" file 
egrep [\'] file 
$ echo egrep '\'' file 
> 

最后一种情况促使更多的投入,因为你还是一个单引号表达式中:它不是单一的一个转义引号(\')引号(因为这不是你如何逃避单引号)。它是单引号之间的反斜杠,带有尾随的开引号。

顺便说一句,逃单引号在单引号字符串,用建筑这样的:

$ echo 'foo'\''bar' 
foo'bar 

什么这实际上做的是间把一个赤裸裸的文字引号(\')两个单引号字符串。这些都是隐含地连接在一起的。

我不知道为什么"\'"匹配的所有行(但它确实看起来。)

+0

您的措辞有点误导:_escaping with quotes_ sounds like you're _using_ quotes escape。好的建议重新:使用'回声'来理清发生了什么 – pb2q 2012-07-28 07:21:09

+0

你会如何逃避单引号中的字符? – bqui56 2012-07-28 07:25:01

0

我认为你是在复杂的,如果你想匹配'引用它"

echo "'" | grep "'"