为什么这些正则表达式不同?

bqu*_*i56 0 regex grep

我正在寻找有撇号的行,并尝试了一些看起来与我相同的表达; 然而,有些人工作,有些人没有.为什么我会得到以下行为:

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
Run Code Online (Sandbox Code Playgroud)

phs*_*phs 5

单引号和双引号在转义时有所不同.放在echo前面看看实际发送到的内容egrep:

$ echo egrep \' file
egrep ' file
$ echo egrep "\'" file
egrep \' file
$ echo egrep "[\']" file
egrep [\'] file
$ echo egrep '\'' file
>
Run Code Online (Sandbox Code Playgroud)

最后一种情况是提示更多输入,因为你仍然在一个单引号中:它不是\'单引号中的转义引号()(因为这不是你如何转义单引号.)这是单引号之间的反斜杠,尾随开头报价.

顺便说一句,要在单引号字符串中转义单引号,请使用如下结构:

$ echo 'foo'\''bar'
foo'bar
Run Code Online (Sandbox Code Playgroud)

这实际上是\'在两个单引号字符串之间放置一个裸的文字引号().然后将它们全部隐式连接在一起.

我不知道为什么"\'"匹配所有行(但它确实似乎.)