1

Тема: CMD/BAT: Grep и кавычки в регулярном выражении [win].

Доброго дня.

Для поиска обрамленных кавычками ссылок в файле, мне кажется самый простой код такой (важно! все происходит в win):

egrep -o "http://[^\"]+" text.txt

Но вот загвоздка: в регулярном выражении используется кавычка, она хоть и экранирована, но все равно ломает мозг cmd.exe.
По-первых не работает авто-дополнение по TAB
Во-вторых не работает перенаправление вывода как ">", так и "|"

Задачи бывают разные и если сделать целью не изменение регулярки для избавления от кавычки, то какой есть выход из такой ситуации?

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

Подскажу, но очень неуверенно. Вместо

\"

попробуйте

""
( 2 * b ) || ! ( 2 * b )

3

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

Пробовал. ) Не то пальто.

Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

DnsIs

egrep -o "http://[^^^"]+" text.txt

^ - это символ экранирования

5

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

JSman пишет:

^ - это символ экранирования

Так тоже не получается (в итоге я все сделал на lua, получилось гораздо быстрее написать код и проще)
Но если не уходить за рамки этой темы, то пока только костыль:

echo -n -e "\x68\x74\x74\x70\x3a\x2f\x2f\x5b\x5e\x22\x5d\x2b\x0a" > REG && egrep -o -f REG text.txt

Причем виндовая команда echo не подходит, нужно брать тоже из GNU утилит.
То есть регулярку пишем в отдельный файл, и потом уже пользуемся ей.

Как запихать в файл строку http://[\"]+ с помощью win-echo я ума не приложу. Проблема в том, что на конце появляются символы окончания строки и перевода каретки, а они все портят.

Нас невозможно сбить с пути, нам пофигу куда идти.

6 (изменено: Rumata, 2020-02-03 15:48:44)

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

DnsIs

Экстраполируя Ваш ответ, подозреваю, что это решение тоже не проходит


echo REGEXP | grep -f - FILENAME

Подразумеваю виндовую команду echo. С юниксовой командой всё должно работать хорошо. По крайней мере в юниксовом терминале.

( 2 * b ) || ! ( 2 * b )

7

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

В общем, не поленился и скачал egrep. Просто запускаем с параметром -f, указываем файл с регулярным выражением.

Содержание reg.txt:


"http://[^"]+"

egrep -f reg.txt text.txt > res.txt
PAUSE

Все пишется в res.txt.

Добавил утилиты с библиотеками, чтобы не пришлось искать по Интернету.

Post's attachments

grep.zip 972.99 kb, 4 downloads since 2020-02-03 

You don't have the permssions to download the attachments of this post.

8

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

DnsIs пишет:

Как запихать в файл строку http://[\"]+ с помощью win-echo я ума не приложу. Проблема в том, что на конце появляются символы окончания строки и перевода каретки, а они все портят.

Никак. "Запихивайте" строку в файл посредством:

@echo off
setlocal enableextensions enabledelayedexpansion

<nul >"Out.txt" set /p sVar=http://[\"]

endlocal
exit /b 0

9

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

Rumata пишет:

Подразумеваю виндовую команду echo. С юниксовой командой всё должно работать хорошо. По крайней мере в юниксовом терминале.

Проверил по всякому, в винде не работает. Сорри. Без кавычки все в порядке, но как только встречается кавычка, все ломается.

JSman пишет:

...Просто запускаем с параметром -f, указываем файл с регулярным выражением.

Да, я писал про такой способ выше. Но я хотел все уместить в одно командную строку, поэтому у меня получилось это сделать лишь с помощью шестнадцатеричных кодов символов.

alexii пишет:

Никак.

Собственно я помнил про эту конструкцию, она уже была на этом форуме (хрен ее знает, как оно работает вообще), но опять же, это только в батнике.


В итоге получается, что для командной строки windows трудно найти простое решение, для поиска кавычек в тексте (не простого поиска, а поиска регуляркой), с последующим выводом в файл. Спасет только батник.

Вероятно что-то можно придумать на perl, но к сожалению я его не знаю. Мне ближе lua, который вероятно будет даже быстрее.

Всем спасибо.

Нас невозможно сбить с пути, нам пофигу куда идти.

10 (изменено: Rumata, 2020-02-04 12:37:04)

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

Попробуйте заменить кавычки их 16-ричным ASCII кодом (x22) и используйте опцию -P

исходный пример из первого сообщения


egrep -o "http://[^\"]+" text.txt

измененный пример


grep -P -o "http://[^\x22]+" text.txt
( 2 * b ) || ! ( 2 * b )

11

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

Rumata пишет:

Попробуйте заменить кавычки их 16-ричным ASCII кодом (x22) и используйте опцию -P

Точно. Эврика! Мой grep был без perl-повых регсэпов и я забыл про него, заменил на другой и вуаля.
Дополню лишь:

"https?://[^\x22]+"

УРА.

Нас невозможно сбить с пути, нам пофигу куда идти.

12 (изменено: wisgest, 2020-02-05 14:02:48)

Re: CMD/BAT: Grep и кавычки в регулярном выражении [win].

DnsIs пишет:
egrep -o "http://[^\"]+" text.txt

Но вот загвоздка: в регулярном выражении используется кавычка, она хоть и экранирована

Не вижу ни одной экранированной с точки зрения cmd.exe кавычки.

Если открывающую кавычку не экранировать, то идущие за ней спецсимволы в экранировании не нуждаются, а если не экранировать — нуждаются:

echo "&"^&^"
echo ^"^&"&"

— оба выведут «"&"&"».

Перенаправления после команды должны работать:

egrep -o "http://[^\"]+^" text.txt >output.txt
egrep -o ^"http://[^^\"]+" text.txt >output.txt
egrep -o ^"http://[^^\^"]+^" text.txt >output.txt

Автодополнение по TAB не получается, вероятно, из-за нечётного числа кавычек. Для этого можно ввести лишнюю кавычку и пробел, затем их удалить.