找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27417|回复: 10

[文本处理] [已解决]批处理如何将一个文本的特定行依次替换成另一个文本的每一行并分别输出到文本

[复制链接]
发表于 2016-9-16 16:50:23 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-9-17 19:42 编辑

批处理如何将一个文本文档的某一特定行逐次替换成另一个文本并分别输出文件
主要诉求如下:
有一个test1.avs,内容为:

  1. samplecontentA
  2. samplecontentB
  3. #trim#
  4. samplecontentC
  5. samplecontentD
复制代码
另有一个trim.txt,内容为:

  1. 091trim(32,18054)
  2. 092trim(18243,36271)
  3. 093trim(36458,54472)
  4. ……
复制代码
想要分别输出以下效果的文档:

  1. samplecontentA
  2. samplecontentB
  3. 091trim(32,18054)
  4. samplecontentC
  5. samplecontentD
复制代码
保存为prefix_091.avs

  1. samplecontentA
  2. samplecontentB
  3. 092trim(18243,36271)
  4. samplecontentC
  5. samplecontentD
复制代码
保存为prefix_092.avs

求具体的实现代码,谢谢了。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2016-9-16 23:47:01 | 显示全部楼层

第三方工具:sed

  1. @echo off
  2. setlocal enableDelayedExpansion

  3. for /f "delims=" %%L in (trim.txt) do (
  4.   set line=%%L
  5.   set prefix=!line:~0,3!
  6.   sed "/^#trim#$/s//%%L/" test1.avs > prefix_!prefix!.avs
  7. )

  8. endlocal
  9. exit /b
复制代码
发表于 2016-9-17 00:02:08 | 显示全部楼层

  1. @echo off
  2. setlocal enableDelayedExpansion

  3. set avsFile=test1.avs
  4. set trimFile=trim.txt

  5. for /f "delims=" %%L in (%trimFile%) do (
  6.   set line=%%L
  7.   set prefix=!line:~0,3!
  8.   type nul > prefix_!prefix!.avs
  9.   for /f "delims=" %%I in (%avsFile%) do (
  10.     if "%%I" == "#trim#" (
  11.       echo %%L
  12.     ) else (
  13.       echo %%I
  14.     )
  15.   ) >> prefix_!prefix!.avs
  16. )

  17. endlocal
  18. exit /b

复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2016-9-17 07:05:27 | 显示全部楼层
回复 3# DiamondbacK


    强大
发表于 2016-9-17 07:13:34 | 显示全部楼层
  1. @echo OFF & setlocal enableDelayedExpansion

  2. for /f "delims=" %%L in (trim.txt) do (
  3.     set line=%%L
  4.     set prefix=!line:~0,3!
  5.     REM repdos专注文本匹配与处理(第三方命令行)
  6.     repdos -d:"test1.avs" -fic:"#trim#" -t:"%%L" >prefix_!prefix!.avs
  7. )

  8. pause
复制代码
虽然第三方比较简单,但是还是赞2楼的纯P写的效果很棒,不过我也发一个占占沙发
 楼主| 发表于 2016-9-17 13:13:52 | 显示全部楼层
本帖最后由 sumirecccp 于 2016-9-17 13:15 编辑

回复 3# DiamondbacK


    谢谢,十分有效果,我也比较喜欢这种不借助第三方工具的纯批处理方式(虽然不知道两者比较起来效率如何。。。。)
 楼主| 发表于 2016-9-17 13:14:41 | 显示全部楼层
顺便附上另一个朋友写的PYTHON代码:

  1. #!/usr/bin/env python

  2. import sys
  3. import re

  4. def readtrimfile(trimfile):
  5.     f = open(trimfile, 'r')
  6.     trimitems = f.readlines()
  7.     f.close()
  8.     return map(lambda x:x.strip(), trimitems)

  9. def readtemplate(avsfile):
  10.     f = open(avsfile, 'r')
  11.     content = f.read()
  12.     f.close()
  13.     return content

  14. def patchitem(template, trimitem):
  15.     idx_trim = template.index('#trim')
  16.     leftpart = template[:idx_trim]
  17.     rightpart = template[idx_trim + 5:]
  18.     result = leftpart + trimitem + rightpart
  19.     prefix_filename = 'prefix_' + trimitem[0:3] + '.avs'
  20.     f = open(prefix_filename, 'w')
  21.     f.write(result)
  22.     f.close()

  23. def main(avsfile, trimfile):
  24.     template = readtemplate(avsfile)
  25.     trimitems = readtrimfile(trimfile)
  26.     for trimitem in trimitems:
  27.         patchitem(template, trimitem)

  28. if __name__ == '__main__':
  29.     if len(sys.argv) != 3:
  30.         print 'usage: ' + sys.argv[0] + ' <avs> <trim>'
  31.         exit(1)
  32.     main(sys.argv[1], sys.argv[2])



复制代码
发表于 2016-9-17 18:24:18 | 显示全部楼层
JScript:

  1. var ForReading = 1, ForWriting = 2, ForAppending = 8
  2. var fso = new ActiveXObject('Scripting.FileSystemObject')

  3. var avsFile = fso.OpenTextFile('test1.avs', ForReading)
  4. var trimFile = fso.OpenTextFile('trim.txt', ForReading)
  5. var outputAvsFile

  6. var avsText = avsFile.ReadAll()
  7. avsFile.close()
  8. var trimLine, prefix, outputText

  9. while (!trimFile.AtEndOfStream) {
  10.     trimLine = trimFile.ReadLine()
  11.     prefix = /^\d+/.exec(trimLine)
  12.     outputText = avsText.split(/^#trim#$/m).join(trimLine)

  13.     outputAvsFile = fso.OpenTextFile(
  14.         'prefix_' + prefix + '.avs', ForWriting, true
  15.     )
  16.     outputAvsFile.Write(outputText)
  17.     outputAvsFile.close()
  18. }
  19. trimFile.close()
复制代码
 楼主| 发表于 2016-9-17 20:11:42 | 显示全部楼层
回复 8# DiamondbacK


    厉害啊,看来以后要多找点课题方便你练手了
发表于 2016-9-17 21:43:33 | 显示全部楼层
本帖最后由 pcl_test 于 2016-9-17 21:59 编辑
  1. powershell -c "$avstext=(gc 'test1.avs');gc 'trim.txt'|%%{$n='prefix_'+($_ -replace '^\s*(\d+).+','$1')+'.avs';$avstext -replace '^\s*#trim#\s*$',$_|Out-File $n}"
  2. pause
复制代码
  1. #*第三方http://www.bathome.net/s/tool/index.html?key=gawk
  2. #*&cls&gawk -f "%~f0" "trim.txt"&pause&exit
  3. BEGIN{
  4.     while(getline<"test1.avs">0){i++;avstext[i]=$0;if($0~/^[[:space:]]*?#trim#[[:space:]]*?$/&&!f)f=i}
  5. }
  6. {
  7.     match($0,/^[[:space:]]*?([0-9]+)/,n);
  8.     for(i=1;i<=length(avstext);i++)print (f!=i?avstext[i]:$0)>"prefix_"n[1]".avs"
  9. }
复制代码
  1. //&cls&cscript -nologo -e:jscript "%~f0"<"test1.avs" "trim.txt"&pause&exit

  2. var fso = new ActiveXObject('Scripting.Filesystemobject');
  3. var avstext = WSH.StdIn.ReadAll();
  4. fso.OpenTextFile(WScript.Arguments(0), 1).ReadAll().replace(/[^\r\n]+/g, function(a){
  5.     fso.CreateTextFile('prefix_' + a.match(/^\s*?(\d+)/)[1] + '.avs', 2).Write(
  6.         avstext.replace(/^\s*?#trim#\s*?$/m, a)
  7.     );
  8. });
复制代码
 楼主| 发表于 2016-9-17 22:53:19 | 显示全部楼层
回复 10# pcl_test


    powershell更简洁,只用一句话
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:26 , Processed in 0.025539 second(s), 10 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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