所以,我的html文件包含如下行:
<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>
我的任务是找到 fid =“RandomString”,并将“”之间的所有内容复制到文本文件中,而不使用任何外部软件。 RandonString长2-100个字符。
答案 0 :(得分: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}})。 但您不希望将双引号添加到变量本身。
第1行在第一个引号之前设置要设置的变量(“"
),第二个在之后>要设置的数据(x=
“),命令 SET 会识别出引号不包含在变量中。因此,可以设置具有特殊字符的可变数据而不会出错。 (将引号放在变量数据中也会起作用,但会为变量数据添加2个特殊字符,并使处理其他搜索和替换命令变得更加困难。)
第2行下一步是删除<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>
之前的所有内容,fid
匹配*fid
之前的所有内容,fid
用什么都代替。
第3行下一步是删除=%
之后的所有内容,这需要一点点破解。通过将";
添加到搜索和替换,可以欺骗命令处理器。 '='告诉命令处理器用以下字符替换="&rem %
,但下一个字符是;"
,这使得前面的set命令成为一个带引号的命令,意味着特殊的{{1} }字符未引用,可以解释它。这基本上将"
之后的所有内容放在一个单独的行上,因此搜索和替换命令不会替换&
。 &
语句用于确保匹配的";
之后的数据不会被解释为命令,并且还意味着将忽略任何重定向字符。
所以命令处理器看到的是:
REM
将";
设置为set x=="RandonString
rem "; v_width=620; v_height=490;</script>
第4行现在我们遇到问题,因为x
以="RandonString
开头,而%x%
和="
都是特殊字符,{ {1}}特别难以匹配。但是,幸运的是我们知道字符串现在以=
开头,因此解决方案很简单。我们只是通过告诉命令处理器以第二个字符(当前字符0 = "
,字符1当前= =
,因此字符2 = ="
)开始,跳过前两个字符。因此,由于第2行删除了包括=
在内的所有内容(包括任何重定向字符),并且第3行删除了包括"
在内的所有内容字符串的结尾(包括任何重定向字符),
R
= fid
。删除所有重定向字符后,根本不需要引用该变量。
第5行只需回显变量";
。