草庐IT

windows - 批量字符转义

coder 2023-11-09 原文

我相当精通为 Windows 编写批处理脚本,但即使过了这么多年,如何正确转义字符仍让我感到困惑。当试图找出正确的方法来转义与 sed 一起使用的正则表达式时,这尤其困难。有什么工具可以帮助我吗?也许可以让我粘贴一个“普通”字符串,然后它会吐出该字符串的正确转义版本?

更新:我不愿意举个例子,因为我不是在寻找关于如何转义一个特定字符串的答案。我也不是在寻找适用于某个特定应用程序的解决方案。我正在寻找一种工具,它可以帮助我为我需要转义的每个字符串获得正确的转义语法,无论什么工具可能从命令行使用它。

话虽如此,我真正想要的正则表达式是

(^.*)(Form Product=")([^"]*") FormType="[^"]*" FormID="([0-9][0-9]*)".*$

采用真正的正则表达式(即就 BATCH 而言未转义)并将其包装在一些 sed 语法中,例如 ssed "s@ --- Insert escaped regex here --- @http://psph/\1/\2@g""%~1" 并最终转义它...同样,是否有任何工具可以帮助转义任何字符串以在 BATCH 命令行上使用?

附注BATCH 的转义语法有太多异常(exception),我什至会满足于一个好的备忘单。

最佳答案

作为dbhenham points out in this comment ,可以在 this answer 的部分内容中找到(更多)更详细的答案(最初由另一个用户 jeb 编写,之后由 dbhenham 进行了大量编辑和更新)关于一个相关但更普遍的问题:

请注意,根据 dbhenham,这个答案是:

incorrect, misleading, and incomplete

我认为这个答案对于几乎所有情况来说仍然足够好,但是根据一个人的确切字符转义需求和这个答案的局限性,可能需要仔细阅读上面的答案。

其余部分经作者许可改编自页面 Batch files - Escape CharactersRob van der Woude's Scripting Pages site .

长见识

Windows (and DOS) batch file character escaping is complicated :

Much like the universe, if anyone ever does fully come to understand Batch then the language will instantly be replaced by an infinitely weirder and more complex version of itself. This has obviously happened at least once before ;)

百分号 %

%可以转义为 %% – “在双引号字符串中可能并不总是需要 [被转义],只需尝试”

通常,使用插入符号 ^

这些字符“可能并不总是需要在双引号字符串中[进行转义],但不会造成伤害”:

  • ^
  • &
  • <
  • >
  • |

示例: echo a ^> b打印 a > b在屏幕上

' “仅在 FOR /F “主题”(即括号之间)中需要[转义],除非 backq 被使用”

` “仅在 FOR /F “主题”(即括号之间)中需要[转义],如果 backq 被使用”

这些字符“仅在 FOR /F “主题”(即括号之间)中需要[转义],甚至在双引号字符串中”:

  • ,
  • ;
  • =
  • (
  • )

使用延迟变量扩展时的双重转义感叹号

!必须转义 ^^!当延迟变量扩展处于事件状态时。

find 中的双引号搜索模式

"""

findstr 中使用反斜杠正则表达式模式

  • \
  • [
  • ]
  • "
  • .
  • *
  • ?

还有

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

As for the answer, I'm afraid the chaos is even worse than the original poster realizes: requirements for escaping parentheses also depend on the string being inside a code block or not!

I guess an automated tool could just insert a caret before every character, then doubling all percent signs - and it would still fail if the string is doublequoted!

此外,各个程序负责解析它们的命令行参数,因此需要进行一些转义,例如对于 sedssed , 可能是由于批处理脚本中调用了特定的程序。

关于windows - 批量字符转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6828751/

有关windows - 批量字符转义的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  6. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  7. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  8. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  9. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐