我想要匹配引号2
、空格以及任何非文字点的字符。
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.exe
Windows 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:\>