首页 > 解决方案 > 在 FOR 循环中为 Windows cmd 中的 sed 转义正则表达式字符串

问题描述

我有一个sed命令,当它自己发出时,它会准确地抓住它应该得到的部分:

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

到现在为止还挺好。现在,当我尝试将此部分放入FOR循环中以将结果存储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

标签: sedcmdescaping

解决方案


有点棘手,因为插入符号在批处理文件本身中使用,然后在子 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

推荐阅读