Board logo

标题: [文本处理] 【已解决】将一个文本里多个特定的字符串依次替换成另一个文本中列出的多行内容 [打印本页]

作者: 6508as    时间: 2016-10-28 16:03     标题: 【已解决】将一个文本里多个特定的字符串依次替换成另一个文本中列出的多行内容

本帖最后由 6508as 于 2016-10-31 10:36 编辑

a.txt文件内容如下:
  TRACK 01 AUDIO
    TITLE "Track01"
    PERFORMER "未知艺术家"
    FLAGS DCP
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE "Track02"
    PERFORMER "未知艺术家"
    FLAGS DCP
    INDEX 00 04:04:51
    INDEX 01 04:06:51
  TRACK 03 AUDIO
    TITLE "Track03"
    PERFORMER "未知艺术家"
    FLAGS DCP
    INDEX 00 08:51:11
    INDEX 01 08:53:11
  TRACK 04 AUDIO
    TITLE "Track04"
    PERFORMER "未知艺术家"
    FLAGS DCP
    INDEX 00 13:43:47
    INDEX 01 13:45:47

b.txt文件内容如下:
01.第一首歌曲名
02.第二首歌曲名
03.第三首歌曲名
04.第四首歌曲名


要求:把a.txt里的 “Track01”   替换为 b.txt 里的  “01.第一首歌曲名”
         把a.txt里的 “Track02”   替换为 b.txt 里的  “02.第二首歌曲名”
         把a.txt里的 ”Track03”   替换为 b.txt 里的  “03.第三首歌曲名”
         把a.txt里的 “Track04”   替换为 b.txt 里的  “04.第四首歌曲名”


替换后的结果如下:
c.txt文件内容如下:
  TRACK 01 AUDIO
    TITLE "01.第一首歌曲名"
    PERFORMER "未知艺术家 "
    FLAGS DCP
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE "02.第二首歌曲名"
    PERFORMER "未知艺术家"
    FLAGS DCP
    INDEX 00 04:04:51
    INDEX 01 04:06:51
  TRACK 03 AUDIO
    TITLE "03.第三首歌曲名"
    PERFORMER "未知艺术家"
    FLAGS DCP
    INDEX 00 08:51:11
    INDEX 01 08:53:11
  TRACK 04 AUDIO
    TITLE "04.第四首歌曲名"
    PERFORMER "未知艺术家"
    FLAGS DCP
    INDEX 00 13:43:47
    INDEX 01 13:45:47

不知道能否实现?看了一些贴,大多是替换某一字符的,
如果能实现还望高手们不吝赐教,谢谢!
作者: pcl_test    时间: 2016-10-28 20:01

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('type "b.txt"') do set /a n+=1&set "#!n!=%%a"
  3. set n=0
  4. for /f "delims=" %%a in ('type "a.txt"') do (
  5.     set "str=%%a"
  6.     if "!str:TITLE=!" neq "!str!" (
  7.         set /a n+=1
  8.         if defined #!n! (
  9.             call echo;    TITLE "%%#!n!%%"
  10.         ) else echo;%%a
  11.     ) else echo;%%a
  12. )
  13. pause
复制代码

作者: pcl_test    时间: 2016-10-28 20:01

本帖最后由 pcl_test 于 2016-10-28 22:00 编辑
  1. //&cls&cscript -nologo -e:jscript "%~f0"&pause&exit
  2. var fso=new ActiveXObject('Scripting.FileSystemObject'),b=[],n=0;
  3. var b=fso.OpenTextFile('b.txt',1).ReadAll().split(/[\r\n]+/);
  4. var a=fso.OpenTextFile('a.txt',1).ReadAll();
  5. var a=a.replace(/\b(TITLE\s*?)".*"/g,function($0,$1){
  6.     n++;
  7.     return b[n-1]?$1+'"'+b[n-1]+'"':$0;
  8. })
  9. WSH.echo(a);
复制代码
  1. rem win7及以上系统运行
  2. powershell -c "$n=0;$b=gc 'b.txt';gc 'a.txt'|%%{if($_ -match '^\s*?TITLE\s*?\".*\"'){if($b[$n]){$_ -replace '\".*\"\s*$',$b[$n];}else{$_};$n++;}else{$_}}"
  3. pause
复制代码
  1. rem 第三方http://www.bathome.net/s/tool/index.html?down&key=gawk
  2. gawk "NR==FNR{b[NR]=$0;next}/^\s*TITLE\s*\".*\"/{t++;if(b[t])sub(/\".*\"/,\"\x22\"b[t]\"\x22\")}1" "b.txt" "a.txt"
  3. pause
复制代码

作者: 6508as    时间: 2016-10-28 20:45

本帖最后由 6508as 于 2016-10-31 10:42 编辑

非常感谢pcl_test版主的帮助!代码很好 祝事事顺心如意!!!
作者: WHY    时间: 2016-10-28 21:24

本帖最后由 WHY 于 2016-10-28 22:41 编辑

居然搞错了...
  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (a.txt) do (
  3.     for /f %%j in ("%%i") do (
  4.         if "%%j" == "TITLE" (set "s=" & set /p "s=" & echo;  %%j "!s!") else echo;%%i
  5.     )
  6. ))<b.txt>c.txt
复制代码

作者: WHY    时间: 2016-10-28 21:27

本帖最后由 WHY 于 2016-11-8 20:02 编辑
  1. set "s=[IO.File]::ReadAllText('a.txt', [Text.Encoding]::Default)"
  2. PowerShell -c "$a=type 'b.txt';[regex]::Replace(%s%, '(?im)(?<=^\s*TITLE\s+\").*?(?=\")',{$a[$global:i++]})"
复制代码

作者: WHY    时间: 2016-10-28 21:32

  1. gawk "{if(match($0,/^(\s*TITLE\s+\").*(\")$/,a)){getline s<\"b.txt\";$0=a[1]s\"\"a[2]}};1" a.txt
复制代码

作者: 6508as    时间: 2016-10-28 22:54

本帖最后由 6508as 于 2016-10-31 10:51 编辑

非常感谢 WHY 热心及时的回答,在这里向您表示真心的感谢!祝您天天好心情!事事顺心!




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