Я заметил, что двойные кавычки используются повсеместно, поэтому я думаю, что это делается в cmd.exe (хотя многие пользователи Linux используют grep, есть версия для Windows. Я приветствую любые исправления для меня по этому поводу, но ваш пример выглядит так, как будто он относится к реализации Windows, благодаря использованию двойных кавычек. Я тоже использую реализацию Windows grep - Gnuwin32. (в отличие от Cygwin, например).
Прежде всего, я хотел бы исправить ошибку в строке, которую вы использовали с помощью grep(я не буду называть это ошибкой в вашем регулярном выражении, так как это проблема cmd.
Вот ваш пример с регулярным выражением grep, которое не работает.
curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?
Как вы говорите, [^\"]
не работает
Давайте посмотрим, что именно передается в grep с помощью cmd (что анализирует grep)
Для этого потребуется программа на C, программа C включена в этот вопрос о неработающей кавычке Получение этого простого регулярного выражения для сопоставления в grep
Я вставлю код программы на C здесь.
Вы можете использовать эту программу, чтобы увидеть, что получает grep или любая другая программа Windows. (Я могу ошибаться по некоторым техническим причинам здесь, и я приветствую исправление, если это так). Тем не менее, это работает.
Вот программа, которую мы будем использовать, чтобы определить, что происходит
#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, to w.exe
Вот простой пример того, что происходит ..
Вот пример, который работает
W:\>w "[^\"]"
argv[0] = w
argv[1] = [^"]
W:\>
Вы видите выше, что наша программа (w) получает 2 параметра, первый - имя программы (w), второй - [^"]
Теперь вот пример намного меньшего размера, у которого тот же сбой, что и у вас, [^\"]
не работает
W:\>w "\"[^\"]"
argv[0] = w
argv[1] = "["]
W:\>
Посмотрите, что получает grep. Я не знаю почему .. Но похоже, что когда это \"стоит перед [^ \"] и вокруг него есть двойные кавычки, тогда [^ \"] не работает, мы видим именно результат, приходит [^ \"] как ["] Мы теряем свою карету ^
Это сохранит нашу карету, как мы видим в программе.
W:\>w "\"[^^\"]"
argv[0] = w
argv[1] = "[^"]
W:\>
Помимо этой проблемы с окнами, существует проблема с вашим регулярным выражением, вы, вероятно, хотите посмотреть цитату, так что вы не соответствуете конечной цитате. Вы правильно включили вид сзади, чтобы не соответствовать стартовой цитате.
В качестве примера
W:\>echo blah alt="test" | grep -o -P "(?<=alt=\")[^^\"]*(?=\")"
test
Предположим, у нас есть этот файл с именем аа
dsfsdf dfdsf alt="here" dddd
rrtrtdfddalt="there"dfdfd
alt="df"
tree="dop"
Теперь мы применяем
W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df
W:\>
Итак, регулярное выражение работает и в grep.
W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df
W:\>
Теперь давайте предположим, что я могу вывести это в файл. AB так AB теперь содержит эти 3 строки. (вы всегда можете скопировать / вставить его в ab)
Теперь Аб имеет
here
there
df
давайте использовать sed, чтобы добавить немного до и после
W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>
И мы могли бы скачать все эти с Wget
W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b >a.c
W:\>type a.c
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>wget -i a.c
--2012-07-26 23:21:06-- http://blah.com/here.htm
Resolving blah.com... ^C
W:\>