Board logo

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

作者: sumirecccp    时间: 2016-9-16 16:50     标题: [已解决]批处理如何将一个文本的特定行依次替换成另一个文本的每一行并分别输出到文本

本帖最后由 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

求具体的实现代码,谢谢了。
作者: DiamondbacK    时间: 2016-9-16 23:47     标题: 第三方工具: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
复制代码

作者: DiamondbacK    时间: 2016-9-17 00:02

  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
复制代码

作者: wskwfkbdn    时间: 2016-9-17 07:05

回复 3# DiamondbacK


    强大
作者: wskwfkbdn    时间: 2016-9-17 07:13

  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写的效果很棒,不过我也发一个占占沙发
作者: sumirecccp    时间: 2016-9-17 13:13

本帖最后由 sumirecccp 于 2016-9-17 13:15 编辑

回复 3# DiamondbacK


    谢谢,十分有效果,我也比较喜欢这种不借助第三方工具的纯批处理方式(虽然不知道两者比较起来效率如何。。。。)
作者: sumirecccp    时间: 2016-9-17 13:14

顺便附上另一个朋友写的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])
复制代码

作者: DiamondbacK    时间: 2016-9-17 18:24

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()
复制代码

作者: sumirecccp    时间: 2016-9-17 20:11

回复 8# DiamondbacK


    厉害啊,看来以后要多找点课题方便你练手了
作者: pcl_test    时间: 2016-9-17 21:43

本帖最后由 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. });
复制代码

作者: sumirecccp    时间: 2016-9-17 22:53

回复 10# pcl_test


    powershell更简洁,只用一句话




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