CCM 发表于 2018-1-3 13:30:48

请教:寻找条件字串并修改下一行(已解决)

本帖最后由 CCM 于 2018-1-4 15:36 编辑

我有一个档案,内容大致如下:
<setting name="Export">
    <value>0</value>
</setting>
<setting name="updateSwitch">
    <value>1</value>
</setting>
<setting name="ELEC_DOC_SETTING">
    <value>3</value>
</setting>
<setting name="FILE_PATH">
    <value>1</value>
</setting>

我想针对红色字这个功能,将数字由1变0,怎么处理会比较快?
这行字的位置不固定,我想过用逐行读取,但就算我找到updateSwitch该怎么去修改他的下一行,这个指令该怎么下?

hnfeng 发表于 2018-1-3 14:38:56

本帖最后由 hnfeng 于 2018-1-3 14:45 编辑

Local $sSource = _
                '<setting name="Export">' & @CRLF & _
                '    <value>0</value>' & @CRLF & _
                '</setting>' & @CRLF & _
                '<setting name="updateSwitch">' & @CRLF & _
                '    <value>1</value>' & @CRLF & _
                '</setting>' & @CRLF & _
                '<setting name="ELEC_DOC_SETTING">' & @CRLF & _
                '    <value>3</value>' & @CRLF & _
                '</setting>' & @CRLF & _
                '<setting name="FILE_PATH">' & @CRLF & _
                '    <value>1</value>' & @CRLF & _
                '</setting>'
Local $sSRERe = StringRegExpReplace($sSource, '(?sm)(<setting name="updateSwitch">.+?<value>)(.+?)(<)', '${1}0${3}')
MsgBox(0, 0, $sSRERe)

zghwelcome 发表于 2018-1-3 14:41:43

$sStr = ClipGet()
$sStr = StringRegExpReplace($sStr,'(?is)(updateSwitch">.+?>)(.*?)(<)','${1}0${3}')
MsgBox(0,0,$sStr)

CCM 发表于 2018-1-4 15:12:31

本帖最后由 CCM 于 2018-1-4 15:38 编辑

不好意思,之前叙述不清楚。

目前有一个config.xml档,里面大概数百行,就是一些功能1或0这样,结构都如下面这样表示:
<setting name="Export">
    <value>0</value>
</setting>
<setting name="updateSwitch">
    <value>1</value>
</setting>
<setting name="ELEC_DOC_SETTING">
    <value>3</value>
</setting>
<setting name="FILE_PATH">
    <value>1</value>
</setting>

我想在这几百行里面找到红字部分updateSwitch,将value值由1改成0,但麻烦的是这三行字的位置在config.xml内并不固定,不然就可以指定行数来覆盖,且由于不同电脑内的值大不相同,所以也不能直接覆盖这个档案。
我用FileWrite(@DesktopDir & "\A.txt", $sSRERe)结果只写入$sSource的内容,前后都被清空,这两天在论坛寻找了几个类似的范例,不过能力有限,实在改不出来,只好请大神们再帮帮忙。

麻烦大家了。

后来用 找 替换 这两个关键字找到一篇文章,按文章修改已经可以了。
附上代码,以利后人查询使用。
谢谢大家。#include <file.au3>
$countline = _FileCountLines(@ScriptDir & '\A.txt')
$contentline = FileReadLine(@ScriptDir & '\A.txt')
For $i = 1 To $countline Step 1
        $content = FileReadLine(@ScriptDir & '\A.txt', $i)
        If @error Then Exit
        If StringRegExp($content, '<setting name="updateSwitch">', 0) = 0 Then ContinueLoop;;;;如果该行不匹配就继续读取、检查下一行
        _FileWriteToLine(@ScriptDir & '\A.txt', $i + 1, '    <value>0</value>', 1);因为要改的是目标下一行,所以$i+1并用新行覆盖旧行
Next

hnfeng 发表于 2018-1-4 15:38:54

本帖最后由 hnfeng 于 2018-1-4 15:40 编辑

回复 4# CCM


    你这个的运行效率可能不高啊。前面两个帖子都能帮你搞掂,你却用了个最笨的办法
页: [1]
查看完整版本: 请教:寻找条件字串并修改下一行(已解决)