grep:尾随反斜杠


Answers:


27

反斜杠是许多应用程序的特殊字符:

  • 包括外壳:您需要使用另一个反斜杠或更优雅地对其进行转义,并尽可能使用引号:

    $ printf '%s\n' foo\\bar 'foo\bar'
    foo\bar
    foo\bar
    

    在此命令接收到两个带有value的参数foo\bar,它们在终端上按原样回显。

    (上面,我使用printfecho许多echo实现而不是自己对反斜杠进行解释(这里将扩展\b为退格字符))。

  • 但是反斜杠也是。的特殊字符grep。该命令可以识别像许多特殊序列\(\|\.,等等。因此,类似地,您需要给grep加上一个双\\精度的实际反斜杠字符。这意味着使用外壳程序需要输入:

    grep 'foo\\bar'
    

    或等效地:

    grep foo\\\\bar
    

    (这两行代码都告诉shell将传递foo\\bar为的参数grep)。

  • 许多其他命令在其某些参数中解释反斜杠……,并且需要两个转义级别(一个转义外壳解释,一个转义命令解释)。


顺便说一句,对于shell,单引号'…'阻止任何形式的字符解释,而双引号仅阻止其中的某些字符:特别是$`\保持其中的活动字符"…"


18

您也可以使用fgrep(仅grep-F标志一起使用)。这迫使grep将模式解释为固定字符串(即,将a \视为文字\)。您仍然需要保护反斜杠不被外壳扩展。

grep -F '\resources\'

该标志在那里是有原因的!我正在尝试grep ..\,即使'..\\'没有得到我想要的结果。grep -F '..\'得到了我想要的东西!谢谢
FreeSoftwareServers

..尝试正确格式化该注释!- > meta.stackexchange.com/questions/201663/...
FreeSoftwareServers

3

grep需要四个反斜杠代表一个反斜杠:

grep "\\\\resources\\\\"

12
这是一种极具误导性的过度简化。 grep只需要1个反斜杠即可转义另一个反斜杠,但是外壳程序还需要将反斜杠加引号。双引号(")不会引用反斜杠,反斜杠会引用反斜杠,这就是为什么示例中的双引号不执行任何操作,而需要使用4个反斜杠。
jw013

即使Windows命令提示符不像* nix那样对待反斜杠,我也必须在Windows中使用四个反斜杠。我想知道GnuWin端口是否误解了shell的效果并以4斜杠的要求进行了硬编码,以为这是的要求grep
Synetech
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.