Board logo

标题: [文本处理] 批处理怎样在包含某字符串的行将指定数值运算后进行替换? [打印本页]

作者: levelintt    时间: 2022-1-6 12:55     标题: 批处理怎样在包含某字符串的行将指定数值运算后进行替换?

如下面例子,1个文件里有多行这样的文本,这只是其中1行,要把包含$CC32字符的行中的$BB0和$HH之间的数字减去600,然后替换掉原来的数字。
$K$AAZYGG1105  $WA    $F011   $F051   $F071   $F111   $ID00003301000101      $DD0$SS01$P01183320      $P05183320      $P07183320      $P11183320      $P13            $P15            $P17            $CC32$CF14     $BB074400$HH204700$WW000$V1000000
完成后是下面这样的:
$K$AAZYGG1105  $WA    $F011   $F051   $F071   $F111   $ID00003301000101      $DD0$SS01$P01183320      $P05183320      $P07183320      $P11183320      $P13            $P15            $P17            $CC32$CF14     $BB073800$HH204700$WW000$V1000000
请各位大佬们、老师们帮忙,马上要临近春节了,祝各位身体健康!工作顺利!在新的一年里事业蒸蒸日上,财运亨通,心想事成!
作者: flashercs    时间: 2022-1-6 13:59

  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. pause
  6. exit /b
  7. #>
  8. $evaluator = [System.Text.RegularExpressions.MatchEvaluator] {
  9.   param([System.Text.RegularExpressions.Match]$m)
  10.   ([long]$m.Value - 600).ToString()
  11. }
  12. $re = [regex]'(?i)(?<=\$BB0)\d+(?=\$HH)'
  13. Get-ChildItem -Path .\*.txt | ForEach-Object {
  14.   if (-not $_.psiscontainer) {
  15.     $lines = [System.IO.File]::ReadAllLines($_.FullName)
  16.     for ($i = 0; $i -lt $lines.Count; $i++) {
  17.       if ($lines[$i] -match '\$CC32') {
  18.         $lines[$i] = $re.Replace($lines[$i], $evaluator)
  19.       }
  20.     }
  21.     [System.IO.File]::WriteAllLines($_.FullName,$lines)
  22.   }
  23. }
复制代码





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