找回密码
 加入
搜索
查看: 1606|回复: 4

[系统综合] 请教:寻找条件字串并修改下一行(已解决)

[复制链接]
发表于 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该怎么去修改他的下一行,这个指令该怎么下?
发表于 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)
发表于 2018-1-3 14:41:43 | 显示全部楼层
$sStr = ClipGet()
$sStr = StringRegExpReplace($sStr,'(?is)(updateSwitch">.+?>)(.*?)(<)','${1}0${3}')
MsgBox(0,0,$sStr)
 楼主| 发表于 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
发表于 2018-1-4 15:38:54 | 显示全部楼层
本帖最后由 hnfeng 于 2018-1-4 15:40 编辑

回复 4# CCM


    你这个的运行效率可能不高啊。前面两个帖子都能帮你搞掂,你却用了个最笨的办法

评分

参与人数 1金钱 +25 收起 理由
zghwelcome + 25

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-19 07:49 , Processed in 0.072509 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表