让这个简单的正则表达式在 grep 中匹配

让这个简单的正则表达式在 grep 中匹配

我想要匹配引号2、空格以及任何非文字点的字符。

这是使用操作系统grep。不是Cygwin 的grep。

C:\>echo "2 008abc.html" | grep -oiP \"2 [^.]
grep: [^.]': No such file or directory

C:\>echo "2 008abc.html" | grep -oiP ^"2 [^.]

C:\>echo "2 008abc.html" | grep -oiP """2 [^.]
grep: [^.]: No such file or directory

C:\>echo "2 008abc.html" | grep -oiP """2 0
grep: 0: No such file or directory

C:\>echo "2 008abc.html" | grep -oiP """"2 0"
"2 0


C:\>echo "2 008abc.html" | grep -oiP """"2 [^.]"

C:\>echo "2 008abc.html" | grep -oiP """"2 0"
"2 0

(我在之前的修订中已经回答了我自己的问题,不需要参考它,但它导致了另一个强烈相关的匹配问题,所以我将这个问题修改为匹配非常相似但遇到问题的东西。)

答案1

看起来你正在使用 Windows 命令提示符 ( cmd.exe) 作为 shell,并且你被它的引用约定或缺乏引用约定所困扰。如果我在Fedora 15Bash shell,它可以工作。如果我使用 Cygwin 的 Bash shell 在 Windows 中运行它,它可以工作。

要使其与 一起工作cmd.exe,您必须更改引号和空格。我在cmd.exeWindows 7 上运行了以下命令。请注意我如何将 grep 命令上的引号更改为使用单引号而不是双引号,并且管道 ( ) 之前没有空格|

我正在使用 Cygwin 版本的 GNU grep,其行为应该与 Win32 GNU grep 相同。

c:\>c:\cygwin\bin\grep --v
GNU grep 2.6.3

Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

c:\>echo "2008abc.html"| c:\cygwin\bin\grep -oiP '\"[^.]'
"2

如果管道符前有空格,则该空格会通过管道符回显,并且 grep 会匹配该空格。这是由于 的愚蠢解析行为造成的cmd.exe

c:\>echo "2008abc.html" | c:\cygwin\bin\grep -oiP '\"[^.]'
"2
"

为了您自己的理智,请查看是否可以使用 Cygwin 的 Bash 或任何其他具有合理和一致的引用约定的 shell。

答案2

这是一个解决方案。

C:\>echo "2 008abc.html" | grep -oiP \"2" "[^.]
"2 0

这个实验很有帮助(w 是 w.exe,是 wc 编译的)

C:\>w \"2\ [^.]
argv[0] = w
argv[1] = "2\
argv[2] = [^.]

C:\>w \"2" "[^.]
argv[0] = w
argv[1] = "2 [^.]

C:\>

这是另一个解决方案

C:\>echo "2 008abc.html" | grep -oiP "\"2 [^^.]"
"2 0

正如你所看到的,我经过一番折腾才找到它,虽然找到得很快

W:\other>w "\"2 [^.]"
argv[0] = w
argv[1] = "2 [.]

W:\other>w "\"2 [\^.]"
argv[0] = w
argv[1] = "2 [\.]

W:\other>w "\"2 [^.]"
argv[0] = w
argv[1] = "2 [.]

W:\other>w "\"2 [^^.]"
argv[0] = w
argv[1] = "2 [^.]

厕所

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i = 0;
    while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
    }
    return 0;
}

这个在 wc 之前很有用,你可以使用它来准确查看 bash 删除了什么。xc

#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[]) {
    printf(GetCommandLine());
    return 0;
}

前任-

C:\>x &
x
C:\>
C:\>x ^&
x  &
C:\>

相关内容