Escape-регулярное выражение для sed в windows cmd в цикле FOR - PullRequest
2 голосов
/ 04 марта 2020

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

sed -r -n 's/^.+new_ldap_user.+authenticity_token.+value="([^"]+).+/\1/p' response.html

Пока все хорошо. Теперь, когда я пытаюсь поместить этот фрагмент в FOR l oop, чтобы сохранить результат из sed в переменной, я понятия не имею, как правильно экранировать несколько кавычек / скобок.

Что я попытался:

FOR /F %i IN ('sed -r -n ^'s/^.+new_ldap_user.+authenticity_token.+value="([^"]+).+/\1/p^' response.html') DO set AUTH=%i

. + / \ 1 / p 'в это время было неожиданным.

Так что мне кажется, что я также должен экранировать закрывающую скобку:

FOR /F %i IN ('sed -r -n ^'s/^.+new_ldap_user.+authenticity_token.+value="([^"]+^).+/\1/p^' response.html') DO set AUTH=%i

Этот код, по крайней мере, не приводит к ошибке, но не приводит к AUTH также должен быть установлен правильно.

Я также пытался удвоить все каретки ^ в пределах regex, но безрезультатно.

Как мне нужно правильно бежать Моя подкоманда sed, чтобы сохранить ее, приводит к AUTH?

1 Ответ

3 голосов
/ 04 марта 2020

Немного сложно, потому что каретка используется в самом пакетном файле, а позже она снова используется в экземпляре sub-cmd.

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

@echo off

set "cmd=sed -r -n 's/^^.+new_ldap_user.+authenticity_token.+value="([^^"]+).+/\1/p' response.html"

FOR /F "delims=" %%i in ('"%%cmd%%"') DO (
    echo ## %%i
)

контекст командной строки

Это немного сложнее, потому что позднее процентное расширение %%cmd%% здесь не работает.

Но вы можете смоделировать его с помощью

FOR /F "delims=" %i in ('^"%^cmd%^"') DO echo %i
...