Powershell RegEx替换多个文件中的文本

时间:2014-05-21 10:37:08

标签: regex powershell

我对powershell和正则表达非常新。我想使用powershell和正则表达式进行更新,如下所示:

我有以下模式的文字。

<Music href="6000111.genre" title="AAA">
  <Music format="ditamap" href="000760.rock" title="222"/>
  <Music format="ditamap" href="Z000756.rock" title="333"/>
</Music>

我需要在扩展名.rock(如果Z已经不存在)中添加带有href的前缀'Z'。那就是href =“000760.rock - &gt; href =”Z000760.rock

<Music href="6000111.genre" title="AAA">
   <Music format="ditamap" href="X000760.rock" title="222"/>
   <Music format="ditamap" href="X000756.rock" title="333"/>
</Music>

我应该得到以下结果:

真的很感谢你的帮助。 问候,rnv

3 个答案:

答案 0 :(得分:2)

我仍然不清楚输入文件中的确切内容(就现有前缀而言),并且您确实想要处理这些内容。

以下是我对样本解决方案的最佳猜测:

@'
<Music href="6000111.genre" title="AAA">
  <Music format="ditamap" href="000760.rock" title="222"/>
  <Music format="ditamap" href="Z000756.rock" title="333"/>
</Music>
'@ | set-content testfile.txt

filter Set-XRock { $_ -replace '(.+href=")[a-z]?(\d+\.rock".+)','$1X$2' }

get-content testfile.txt | Set-XRock | Set-Content newfile.txt

get-content newfile.txt

<Music href="6000111.genre" title="AAA">
  <Music format="ditamap" href="X000760.rock" title="222"/>
  <Music format="ditamap" href="X000756.rock" title="333"/>
</Music>

您也可以使用环视正则表达式,但是为了替换/插入字符串的中间,我通常会发现它可以使更直观的代码捕获替换/插入点前后的文本,并使用反向引用来重建字符串在中间替换/插入文本。

答案 1 :(得分:0)

在UltraEdit中,我正在执行以下RegEx(Perl)

find:href = [&#34;] X?([^&#34;] *)。ditamap [&#34;] 替换:href =&#34; X \ 1.ditamap&#34;

答案 2 :(得分:0)

感谢mjolinor,

这是我如何整合你的答案:

function replaceText{
    get-childitem -path $mapfolder | 
     Where-Object {$_.extension -eq ".mus"} | 
       foreach-object {
         echo " Replace dita map maprev: $_"
  (Get-Content $mapfolder\$_) | 
     Foreach-Object {
    $_ -replace '(.+href=")[a-z]?(\d+\.rock".+)','$1X$2'} |
                Out-File $mapfolder\$_
       }
}