我有编程背景,但我对powershell脚本和regexp都很陌生。Regexp一直回避我,我以前的项目从未“强迫”我去学习它。
考虑到这一点,我有一个包含需要替换的文本行的文件。我不能依赖于知道行在哪里,它前面是否有空格,或者被替换的实际文本是什么。我知道将在序言和前面的案文被取代。
我再说一遍,我不知道“替换这个案文”的价值。我只会知道它的序言是什么“以及它之前是什么”。经编辑的任择议定书以澄清。谢谢!
文本行我需要替换
<find-this-text>Replace This Text</find-this-text>
势码
(gc $file) | % { $_ -replace “”, “” } | sc $file
发布于 2015-05-15 18:40:21
XML不是面向行的格式(节点可能跨越几行,正如一行可能包含多个节点一样),因此不应该像编辑那样编辑XML。使用适当的XML解析器。
$xmlfile = 'C:\path\to\your.xml'
[xml]$xml = Get-Content $xmlfile
$node = $xml.SelectSingleNode('//find-this-text')
$node.'#text' = 'replacement text'
要将XML保存为"UTF-8不带BOM“格式,可以调用Save()
方法,StreamWriter
可以做正确的事情™:
$UTF8withoutBOM = New-Object Text.UTF8Encoding($false)
$writer = New-Object IO.StreamWriter ($xmlfile, $false, $UTF8withoutBOM)
$xml.Save($writer)
$writer.Close()
发布于 2015-05-15 16:17:08
正则表达式中的.*被许多人认为是“贪婪的”和危险的。如果包含此标记的行和它的数据不包含任何其他内容,那么根据我的理解,实际上没有任何重大的风险。
$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
https://stackoverflow.com/questions/30263775
复制相似问题