使用powershell和regexp替换整行文本?

时间:2015-05-15 15:52:34

标签: regex powershell

我有编程背景,但我对PowerShell脚本和regexp都很新。 Regexp总是让我望而却步,而我之前的项目从未“强迫”我学习它。

考虑到这一点,我有一个文件,我需要替换一行文本。我不能依赖于知道该行存在的位置,它前面是否有空格,或者被替换的ACTUAL文本是什么。我知道将要替换的文本前言和先例。

再说一遍,我不会知道“替换此文本”的价值。我只会知道它的前言是什么,以及它之前是什么“”。编辑OP澄清。谢谢!

我需要替换的文字行

<find-this-text>Replace This Text</find-this-text>

潜在代码

(gc $file) | % { $_ -replace “”, “” } | sc $file
  • 获取文件的内容,将其括在括号中以确保首先读取文件然后关闭,以便在尝试保存文件时不会引发错误。

  • 遍历每一行,并发出replace语句。 这是我可以使用的帮助。

  • 使用Set-Content保存文件。我的理解是这种方法更可取,因为它需要考虑编码,如UTF8。

2 个答案:

答案 0 :(得分:4)

XML不是面向行的格式(节点可能跨越多行,就像一行可能包含多个节点一样),因此不应该像编辑那样对其进行编辑。改为使用正确的XML解析器。

$xmlfile = 'C:\path\to\your.xml'

[xml]$xml = Get-Content $xmlfile
$node = $xml.SelectSingleNode('//find-this-text')
$node.'#text' = 'replacement text'

要以“UTF-8无BOM”格式保存XML,您可以使用Save()调用StreamWriter方法做正确的事情:

$UTF8withoutBOM = New-Object Text.UTF8Encoding($false)
$writer = New-Object IO.StreamWriter ($xmlfile, $false, $UTF8withoutBOM)
$xml.Save($writer)
$writer.Close()

答案 1 :(得分:2)

正则表达式中的。*将被视为&#34;贪婪&#34;许多人都很危险如果包含此标记的行及其数据不包含任何其他内容,那么根据我的理解,确实没有任何重大风险。

$file = "c:\temp\sms.txt"
$OpenTag = "<find-this-text>"
$CloseTag = "</find-this-text>"
$NewText = $OpenTag + "New text" + $CloseTag

(Get-Content $file) | Foreach-Object {$_ -replace "$OpenTag.*$CloseTag", $NewText} | Set-Content $file