-2

Я хочу сопоставить кавычку, 2 , пробел и любой символ, который не является буквальной точкой.

Это использует GnuWin32 grep. Не в Cygwin's 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

(Я ответил на свой вопрос в предыдущей редакции, нет необходимости ссылаться на него, но это приводит к другой сильно связанной проблеме сопоставления, поэтому я изменил этот вопрос, чтобы сопоставить что-то очень похожее, но столкнулся с проблемой.)

2 ответа2

2

Похоже, что вы используете командную строку Windows (cmd.exe) в качестве оболочки, и вас сбивают с толку ее соглашения о цитировании или их отсутствие. Если я запускаю вашу команду в оболочке Fedora 15 Bash, она работает. Если я запускаю его в Windows, используя оболочку Cygwin Bash, это работает.

Чтобы заставить его работать с 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's Bash или любую другую оболочку с разумными и последовательными соглашениями о цитировании.

0

Это решение.

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

Этот эксперимент помог (w is 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. хс

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

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

экс-

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .