Board logo

标题: [文本处理] 如何用批处理修改文本里的多行内容 [打印本页]

作者: cjt211    时间: 2021-5-11 17:50     标题: 如何用批处理修改文本里的多行内容

原文本节选:
......
Boot  Option5
        *Disable
        Enable
Boot  Option6
        Disable
        *Enable
Boot  Option7
......

想通过win10 cmd的批处理只修改其中的Boot  Option6,其它不变,改成如下(注:Disable和Enable前面都空了个tab键),并生成一个新文件:
Boot  Option6
        *Disable
        Enable
作者: Batcher    时间: 2021-5-11 20:46

回复 1# cjt211


不建议直接修改原始文件的内容。试试这个方法:
假定文件为 1.conf
准备一个文件 1.conf.Option6.Disable
准备另一个文件 1.conf.Option6.Enable

然后根据不同的提交执行:
copy /y "1.conf.Option6.Disable" "1.conf"
或者执行:
copy /y "1.conf.Option6.Enable" "1.conf"
作者: WHY    时间: 2021-5-11 22:28

本帖最后由 WHY 于 2021-5-12 13:24 编辑

sed下载
  1. sed -r "/Boot +Option6$/{:a;N;/Boot +Option[^6]/!ba;s/(\s)(Disable)/\1*\2/;s/\*(Enable)/\1/}" a.txt > b.txt
复制代码

作者: cjt211    时间: 2021-5-12 16:13

回复 2# Batcher


    因为那个1.conf是其他第三方程序生成的,不同的机器生成的内容也不固定,无法提前获知,只是所有的conf文件里都有相同的一个option选项,所以我想通过批处理自动修改下这个option的状态
作者: cjt211    时间: 2021-5-12 16:23

WHY 发表于 2021-5-11 22:28



    多谢,下载了sed用您提供的命令确实可以正常修改,不过里面的“N;/fast\s+Boot[^6]”这个用法不太明白,真实的文档里并不是Boot Option+数字的形式,而是每一个Option的名字都不一样。如下这种:
。。。
Boot  key
        *Disable
        Enable
Power  On
        Disable
        *Enable
secure  boot
        Disable
        *Enable
。。。
麻烦您再受累帮忙看看,我如果就想更改secure boot的状态,该怎么写呢?谢谢!
作者: WHY    时间: 2021-5-12 20:42

本帖最后由 WHY 于 2021-5-13 20:47 编辑

回复 5# cjt211


    比如,修改 Power  On 这一行到下一个以非空白字符开头的行(即:secure  boot)之间的 Enable 和 Disable 的状态:
  1. sed -r "/^Power\s+On$/,/^\S/{s/^(\s+)(Disable)$/\1*\2/;s/^(\s+)\*(Enable)$/\1\2/}" a.txt > b.txt
复制代码

作者: qixiaobin0715    时间: 2021-5-12 22:50

  1. @echo off
  2. set "var=Boot  Option6"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%a in (1.conf) do (
  5.     if not defined n (
  6.         echo,%%a
  7.     ) else (
  8.         set /a n+=1
  9.         if !n! equ 1 (
  10.             set "str=%%a"
  11.             set "str=!str: = *!"
  12.             echo,!str!
  13.         ) else (
  14.             set "str=%%a"
  15.             set "str=!str: *= !"
  16.             echo,!str!
  17.             set n=
  18.         )
  19.     )
  20. if "%%a"=="%var%" set n=0
  21. )
  22. pause
复制代码

作者: cjt211    时间: 2021-5-13 10:07

回复 6# WHY


  可以work了,非常感谢!
作者: cjt211    时间: 2021-5-13 10:09

qixiaobin0715 发表于 2021-5-12 22:50



    测试了下,只是把1.conf的内容在屏幕上都输出了下,感觉并没有进入下面的处理逻辑里面,您再帮忙看下吧
作者: WHY    时间: 2021-5-13 20:52

js
  1. var fso = new ActiveXObject('Scripting.FileSystemObject');
  2. var f = fso.OpenTextFile('a.txt', 1);
  3. var arr = [];
  4. var flag = false;
  5. while(!f.AtEndOfStream){
  6.     var s = f.ReadLine();
  7.     if(flag){
  8.         s = s.replace(/^(\s+)(Disable)$/, '$1*$2');
  9.         s = s.replace(/^(\s+)\*(Enable)$/, '$1$2');
  10.         if(/^\S/.test(s)) flag = false;
  11.     } else if(/^Power\s+On$/.test(s)){
  12.         flag = true;
  13.     }
  14.     arr.push(s);
  15. }
  16. fso.OpenTextFile('b.txt', 2, true).Write(arr.join('\r\n'));
复制代码

作者: cjt211    时间: 2021-5-14 11:13

回复 10# WHY


    感谢,感谢,非常感谢!这个js的例子我大概能看得明白,也验证过了,没有问题,以后我也可以照着您这个例子修改其他的选项了,再次感谢您的大力支持!
作者: Gin_Q    时间: 2021-5-14 12:52

来一个Python的!
  1. # python3.7
  2. target = "secure  boot"
  3. disable = "\t*Disable\n\tEnable\n"
  4. enable = "\tDisable\n\t*Enable\n"
  5. change_content_flag = True
  6. if change_content_flag:
  7.     change_content = disable
  8. else:
  9.     change_content = enable
  10. lines = None
  11. line_number = 0
  12. with open("1.conf", "r+") as frw:
  13.     lines = frw.readlines()
  14.     for line in lines:
  15.         if line.find(target) != -1:
  16.             lines.pop(line_number+1)
  17.             lines.pop(line_number+1)
  18.             lines.insert(line_number + 1, change_content)
  19.             break
  20.         line_number += 1
  21.     frw.seek(0)
  22.     frw.writelines(lines)
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2