Hai*_*Dog 41 windows scripting batch-file
我非常擅长为Windows编写批处理脚本,但即便在这些年后如何正确地逃避字符让我感到困惑.在尝试找出正确的方法来逃避正则表达式以便与sed一起使用时,这一点尤其困难.有什么工具可以帮助我吗?也许某些东西允许我粘贴在"普通"字符串中并且它会吐出正确转义的字符串版本?
更新: 我不愿意举一个例子,因为我不是在寻找如何逃避一个特定字符串的答案.我也不是在寻找适合某个特定应用的解决方案.我正在寻找一种工具,它可以帮助我为每个我需要逃脱的字符串获取正确的转义语法,无论从命令行使用什么工具.
那就是我真正想要的正则表达式
(^.*)(Form Product=")([^"]*") FormType="[^"]*" FormID="([0-9][0-9]*)".*$
Run Code Online (Sandbox Code Playgroud)
采用真正的正则表达式(即就BATCH而言未转义)并将其包装成一些sed语法,例如ssed "s@ --- Insert escaped regex here --- @http://psph/\1/\2@g" "%~1"最后将其转义...再次,是否有任何工具可以帮助转义任何字符串以便在BATCH命令行上使用?
ps BATCH的逃避语法有很多例外,我甚至会选择一个好的备忘单.
Ken*_*itt 53
这适用于与笔者从页面的权限批处理文件-转义字符上抢的van der Woude的脚本页的网站.
就像宇宙中,如果有谁不完全明白过来批次,则语言将立即被自己的一个无限离奇,更复杂的版本替换.这显然至少发生过一次;)
%可以转义为%- "可能并不总是需要[被转义]双引号字符串,只是尝试"
这些字符"在双引号字符串中可能并不总是需要[转义],但它不会受到伤害":
%%^^&<>是"仅在|"主体"(即括号之间)需要[被转义] ,除非 echo a ^> b使用"
a > b是"仅在'"主题"(即括号之间)被要求[被转义] ,如果 FOR /F被使用"
这些字符"仅在backq"主题"中(即在括号之间)被"转义",即使在双引号字符串中":
`FOR /FbackqFOR /F,;必须=在延迟变量扩展处于活动状态时进行转义.
(搜索模式中的双重双引号) → !
^^!表达式模式中使用反斜杠find"""findstr\[]Rob在这个问题上进一步评论(通过与我自己的电子邮件通信):
至于答案,我担心混乱比原来的海报更难实现:转义括号的要求也取决于代码块内的字符串与否!
我想一个自动化工具可以在每个角色之前插入插入符号,然后将所有百分号加倍 - 如果字符串被双引号,它仍然会失败!
此外,各个程序负责解析它们的命令行参数,因此例如for "或者所需的一些转义.可能是由批处理脚本中调用的特定程序引起的.
批处理的转义字符是caret(^).如果要在脚本中包含任何管道字符,则需要在字符前加上插入符号:
:: Won't work:
@echo Syntax: MyCommand > [file]
:: Will work:
@echo Syntax: MyCommand ^> [file]
Run Code Online (Sandbox Code Playgroud)
您可以简单地使用外部文件作为 sed 的输入。
或者直接批量使用字符串,使用延迟扩展也是一个好主意。
setlocal DisableDelayedExpansion
set "regEx=s/^#*$/""/g"
setlocal EnableDelayedExpansion
sed !regEx! file.txtRun Code Online (Sandbox Code Playgroud)
编辑:如何在批处理中使用未修改的字符串
这使用 findstr 直接从批处理中获取字符串并将其返回到结果变量中。
所以你可以按原样使用 sed-string 。
@echo off
setlocal
REM SedString1#(^.*)(Form Product=")([^"]*") FormType="[^"]*" FormID="([0-9][0-9]*)".*$
call :GetSEDString result SedString1
setLocal EnableDelayedExpansion
echo the sedString is !result!
sed !result!
goto :eof
:GetSEDString <resultVar> <searchName>
:: Search the own batch file for <searchName> in a line with "REM <searchName>#"
:: Return all after the "#" without any modification
setLocal DisableDelayedExpansion
for /f "usebackq tokens=* delims=" %%G in (`findstr /n /c:"REM %~2#" "%~f0"`) do (
set "str=%%G"
)
setLocal EnableDelayedExpansion
set "str=!str:*#=!"
for /F "delims=" %%A in ("!str!") DO (
endlocal
endlocal
set "%~1=%%A"
goto :eof
)
goto :eof
Run Code Online (Sandbox Code Playgroud)