标题: [文本处理] 如何用批处理修改文本里的多行内容 [打印本页]
作者: 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下载- 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 的状态:- 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
- @echo off
- set "var=Boot Option6"
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.conf) do (
- if not defined n (
- echo,%%a
- ) else (
- set /a n+=1
- if !n! equ 1 (
- set "str=%%a"
- set "str=!str: = *!"
- echo,!str!
- ) else (
- set "str=%%a"
- set "str=!str: *= !"
- echo,!str!
- set n=
- )
- )
- if "%%a"=="%var%" set n=0
- )
- 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- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var f = fso.OpenTextFile('a.txt', 1);
- var arr = [];
- var flag = false;
- while(!f.AtEndOfStream){
- var s = f.ReadLine();
- if(flag){
- s = s.replace(/^(\s+)(Disable)$/, '$1*$2');
- s = s.replace(/^(\s+)\*(Enable)$/, '$1$2');
- if(/^\S/.test(s)) flag = false;
- } else if(/^Power\s+On$/.test(s)){
- flag = true;
- }
- arr.push(s);
- }
- 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的!- # python3.7
-
- target = "secure boot"
- disable = "\t*Disable\n\tEnable\n"
- enable = "\tDisable\n\t*Enable\n"
-
- change_content_flag = True
-
- if change_content_flag:
- change_content = disable
- else:
- change_content = enable
-
- lines = None
- line_number = 0
-
- with open("1.conf", "r+") as frw:
- lines = frw.readlines()
- for line in lines:
- if line.find(target) != -1:
- lines.pop(line_number+1)
- lines.pop(line_number+1)
- lines.insert(line_number + 1, change_content)
- break
- line_number += 1
- frw.seek(0)
- frw.writelines(lines)
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |