【问题标题】:What are the difference between double backslash and single slash in reg for .?reg for . 中的双反斜杠和单斜杠有什么区别?
【发布时间】:2016-07-28 03:39:50
【问题描述】:

下面两个命令:

grep ', \\.' enrolments


grep ', \.' enrolments

得到与下图相同的结果

COMP4001|4368523|Doddau Yobhazravi, .             |8684  |M

COMP9315|4368523|Doddau Yobhazravi, .             |8684  |M

COMP9321|4368523|Doddau Yobhazravi, .             |8684  |M

COMP9331|4368523|Doddau Yobhazravi, .             |8684  |M

COMP3121|4896558|Vozaila, .                       |3978/3|F

COMP9321|4896558|Vozaila, .                       |3978/3|F

COMP9031|4389601|Yiehil, .                        |8680/2|M

COMP9318|4389601|Yiehil, .                        |8680/2|M

reg 中的双反斜杠和单斜杠有什么区别?

【问题讨论】:

  • 你没有在他的问题中演示双反斜杠。
  • 您能否确认您使用的是grep ', \.' 注册而不是grep ", \." 注册?我只能用双引号重现。
  • @rici : 同样在这里.. 操作员也可能会分享一些关于他的环境的信息。
  • @sjsam:如果它们是双引号,那么在任何兼容的 shell 上都会出现这种行为。
  • 双反斜杠会转义最后一个而不是点,但单反斜杠会转义点。

标签: bash shell unix


【解决方案1】:

我怀疑您实际上在 shell 命令中使用了双引号而不是单引号。

在 shell 中,", \."", \\."完全相同的字符串。它们也与', \.' 相同。但', \\.' 不同。

在双引号字符串中,只有少数字符可以使用反斜杠进行转义。反斜杠的任何其​​他使用都被视为普通字符。由于. 不是字符之一(它们是 $ ` \ " 和换行符) ,\. 中的 \ 不被认为是特殊的。另一方面,\\ 中的第一个 \ 被视为转义字符,因此它转义了第二个\。无论哪种方式,你都会得到 \ ..

在单引号字符串中,反斜杠字符从不被视为特殊字符。它始终被视为普通字符。

因此:

$ echo "\." "\\." '\.' '\\.'
\. \. \. \\.

所以如果你使用双引号,这两个命令

grep ", \\." enrolments

grep ", \." enrolments

其实做的一模一样,和grep无关。在这两种情况下,传递给 grep 的模式都是 , \.grep 然后将反斜杠字符解释为使 . 成为普通模式字符而不是通配符。

但是,grep ', \\.' enrolments 会将模式 , \\. 传递给 grep,这将被解释为搜索序列 , SP \ 后跟任何字符。您提供的任何示例行都不匹配,因为它们都不包含文字反斜杠。

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多