批量字符转义

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的脚本页的网站.

TLDR

Windows(和DOS)批处理文件字符转义很复杂:

就像宇宙中,如果有谁完全明白过来批次,则语言将立即被自己的一个无限离奇,更复杂的版本替换.这显然至少发生过一次;)

百分号

%可以转义为%- "可能并不总是需要[被转义]双引号字符串,只是尝试"

通常,使用Caret

这些字符"在双引号字符串中可能并不总是需要[转义],但它不会受到伤害":

  • %%
  • ^
  • ^
  • &
  • <

>是"仅在|"主体"(即括号之间)需要[被转义] ,除非 echo a ^> b使用"

a > b是"仅在'"主题"(即括号之间)被要求[被转义] ,如果 FOR /F被使用"

这些字符"仅在backq"主题"中(即在括号之间)被"转义",即使在双引号字符串中":

  • `
  • FOR /F
  • backq
  • FOR /F
  • ,

使用延迟变量扩展时的双逃逸感叹号

;必须=在延迟变量扩展处于活动状态时进行转义.

(搜索模式中的双重双引号

)!

在正则^^!表达式模式中使用反斜杠

  • find
  • "
  • ""
  • findstr
  • \
  • [
  • ]

Rob在这个问题上进一步评论(通过与我自己的电子邮件通信):

至于答案,我担心混乱比原来的海报更难实现:转义括号的要求也取决于代码块内的字符串与否!

我想一个自动化工具可以在每个角色之前插入插入符号,然后将所有百分号加倍 - 如果字符串被双引号,它仍然会失败!

此外,各个程序负责解析它们的命令行参数,因此例如for "或者所需的一些转义.可能是由批处理脚本中调用的特定程序引起的.

  • 虽然这是一个好的开始,但这个答案(以及 Rob Van der Woud 的网站)中有很多不正确、误导性和不完整的陈述。要真正理解,请参阅 /sf/answers/286659341/。 (4认同)
  • 我总是发现Rob Vanderwoude的网站是学习BATCH的一个很好的参考,并且已经阅读了很多部分,但不知怎的,我从未读过那部分.谢谢你指出来. (3认同)

Pat*_*uff 6

批处理的转义字符是caret(^).如果要在脚本中包含任何管道字符,则需要在字符前加上插入符号:

:: Won't work:
@echo Syntax: MyCommand > [file]

:: Will work:
@echo Syntax: MyCommand ^> [file]
Run Code Online (Sandbox Code Playgroud)

  • 您能否举一些示例,说明在 Windows BATCH 中使用脱字符号以外的其他内容来转义字符? (2认同)

jeb*_*jeb 5

您可以简单地使用外部文件作为 sed 的输入。

或者直接批量使用字符串,使用延迟扩展也是一个好主意。

setlocal DisableDelayedExpansion
set "regEx=s/^#*$/""/g"
setlocal EnableDelayedExpansion
sed !regEx! file.txt
Run 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)