Board logo

标题: [文本处理] 批处理如何从文本里随机提取一行替换到另一个文本? [打印本页]

作者: qq866286    时间: 2020-10-31 21:39     标题: 批处理如何从文本里随机提取一行替换到另一个文本?

A文本如何下
a.txt
ethernet0.address = "a2:1D:7CD:AE:AE"
ethernet0.address = "50:16:82:8B:67:36"
ethernet0.address = "F4:FE:16:C9:64:B6"
ethernet0.address = "A2:07:B1:7A:15:47"
ethernet0.address = "36:44:6C:36:1E:C5"
ethernet0.address = "B0:05:89:FE:E1:46"

B.txt
ethernet1.wakeOnPcktRcv = "FALSE"
ethernet1.addressType = "generated"
ethernet1.linkStatePropagation.enable = "TRUE"
ethernet0.address = "66:5A:DB:0C:A1:4D"
ethernet1.pciSlotNumber = "-1"
ethernet1.generatedAddress = "00:0c:29:59:ac:e9"
ethernet1.generatedAddressOffset = "10"
tools.remindInstall = "TRUE"
floppy0.present = "FALSE"
tools.syncTime = "FALSE"

批处理如何实现从a.txt文本里随机或者顺序取一行替换B.txt里的ethernet0.address = 开头的这行,包括双引号?本人小小白,研究半天sed还有find貌似实现有点困难,请高人指点,主要是还包括特殊符号
作者: Batcher    时间: 2020-10-31 22:37

回复 1# qq866286


请参考Q-04和Q-05把bat文件和ini文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ

命令行工具 sed.exe 下载地址:
http://bcn.bathome.net/s/tool/index.html?key=sed
  1. @echo off
  2. set "FileA=A.txt"
  3. set "FileB=B.txt"
  4. for /f %%a in ('type "%FileA%" ^| find /c /v ""') do (
  5.     set "RowNum=%%a"
  6. )
  7. set /a RndNum=%random%%%(%RowNum%-1+1)+1
  8. for /f "tokens=3" %%a in ('type "%FileA%" ^| sed -n "%RndNum%p"') do (
  9.     set "NewMAC=%%~a"
  10. )
  11. sed -i "/^ethernet0/ s/.*/ethernet0.address = "%NewMAC%"/" "%FileB%"
复制代码

作者: qq866286    时间: 2020-10-31 23:22

回复 2# Batcher


    刚刚测试了一下,“”没有加进去,不知道应该如何改进?
作者: yhcfsr    时间: 2020-10-31 23:28

  1. #&cls&@Powershell "& {[ScriptBlock]::Create("'#' + ([io.file]::ReadAllText('%~f0',[text.encoding]::Default))").Invoke()}" & pause & exit
  2. $a_txt = 'a.txt'
  3. $b_txt = 'b.txt'
  4. $text_a = [io.file]::ReadAllLines($a_txt,[text.encoding]::Default)|?{$_ -ne ''};
  5. $text_b = [io.file]::ReadAllLines($b_txt,[text.encoding]::Default);
  6. $rnline = Get-Random -InputObject $text_a -Count 1;
  7. $text_b -replace '^ethernet0.address =.*',$rnline|Set-Content -Path $b_txt -Encoding Default
复制代码

作者: qq866286    时间: 2020-10-31 23:32

本帖最后由 qq866286 于 2020-10-31 23:36 编辑

回复 4# yhcfsr


感谢大神!win10下测试好用,谢谢
作者: Batcher    时间: 2020-11-1 21:28

回复 3# qq866286


2楼最后一行改成这样试试:
  1. sed -i "/^ethernet0/ s/.*/ethernet0.address = \"%NewMAC%\"/" "%FileB%"
复制代码

作者: qq866286    时间: 2020-11-3 20:44

回复 6# Batcher


    感谢,可以了!谢谢




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