1

所以,我有一个带有如下行的html文件:

<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>

我的任务是找到fid="RandomString"并将 "" 之间的所有内容复制到文本文件中,而无需使用任何外部软件。RandonString 的长度为 2-100 个字符。

4

1 回答 1

4

这并不难,这里有一个 5 行的解决方案:

set "x=<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>"
set "x=%x:*fid=%"
set "x=%x:";="&rem %
set  x=%x:~2%
echo %x%

对正在发生的事情的解释。

您必须处理 5 个特殊字符,即字符串中的 , , , 以及<用于>修剪=尾随数据的字符。 "&

第 1-3 行: <>都是重定向字符,因此要处理它们,需要将整个变量用双引号 ( ") 括起来。但是您不希望将双引号添加到变量本身。

第 1 行通过将第一个引号放在要设置的变量之前x=(" ),将第二个引号放在要设置的数据之后<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>( "),命令SET识别出引号不包含在变量中。因此可以正确设置带有特殊字符的变量数据。(将引号放在变量数据中也可以,但会在变量数据中添加 2 个特殊字符,使处理其他搜索和替换命令更加困难。)

第 2 行下一步是删除所有内容,包括fid*fid匹配所有内容fid,然后=%将其替换为空。

第 3 行下一步是删除 之后的所有内容";,这需要一点技巧。="&rem %可以通过添加搜索和替换来欺骗命令处理器执行此操作。'=' 告诉命令处理器;"用后面的字符替换,但下一个字符是",这使得前面的 set 命令成为带引号的命令,这意味着特殊&字符没有被引用,它可以被解释。这实际上将所有内容&放在了单独的行上,因此搜索和替换命令";什么都不替换。该REM语句用于确保匹配后的数据";不被解释为命令,也意味着任何重定向字符都将被忽略。

所以命令处理器看到的是:

set x=="RandonString
rem "; v_width=620; v_height=490;</script>

设置x="RandonString

第 4 行现在我们遇到了一个问题,因为%x%,="=都是"特殊字符,=特别难以匹配。但是,幸运的是我们知道字符串现在以 开头=",所以解决方案很简单。我们通过告诉命令处理器从第二个字符开始(当前字符 0 = =,当前字符 1 = ",所以字符 2 = R)来跳过前两个字符。因此,由于第 2 行删除了所有内容(包括任何重定向字符)直到并包括fid,并且第 3 行删除";了所有内容,包括字符串末尾(包括任何重定向字符),
%x:~2%=RandonString. 删除所有重定向字符后,根本不需要引用该变量。

第 5 行只是回显变量x

于 2012-10-20T21:55:06.193 回答