【问题标题】:Replace an entire line of text using powershell and regexp?使用 powershell 和 regexp 替换整行文本?
【发布时间】:2015-07-27 15:07:40
【问题描述】:

我有编程背景,但我对 powershell 脚本和正则表达式都很陌生。正则表达式一直让我望而却步,而我之前的项目也从未“强迫”我学习它。

考虑到这一点,我有一个文件,其中包含需要替换的一行文本。我不能依赖于知道该行存在的位置,它前面是否有空格,或者被替换的实际文本是什么。我知道在被替换的文本之前和之前会出现什么。

再次,我不会知道“替换此文本”的价值。我只会知道它“”的前言和“”的前言。编辑 OP 以澄清。谢谢!

我需要替换的文本行

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

潜在代码

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

  • 遍历每一行,并发出替换语句。 这是我可以寻求帮助的地方。

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

【问题讨论】:

  • 你需要这些都在一行,还是可以是一个脚本?
  • @Tony Hinkle - 脚本可以工作,甚至可能更可取!
  • 另见:stackoverflow.com/questions/17144355/… 这个问题可能应该作为副本关闭。如果该页面上的答案是您需要的,请告诉我,我会标记此答案以供版主删除。
  • 您是否有find-this-text 标签所建议的 XML 文件,或者数据只是纯文本,您需要在要替换的文本之前和之后匹配一些已知的文本片段?如果是 XML,则不应使用简单的字符串替换。另外,您究竟需要更换什么?只是已知片段之间的文字?还是整条线?如果是后者:结果应该是什么样子?
  • 这是一个 XML 文件,我已经尝试通过将 XML 文件转换为 XML 来修改 XML 文件,然后使用 XML cmdlet 导航和替换该值。我遇到的问题是,通过使用 Xml.Save 它将编码类型从“UTF-8 without BOM”更改为“UTF-8”。这似乎没什么大不了的,但它会导致程序解析 xml 配置文件失败。它期待“没有 BOM 的 UTF”编码格式。我想通过使用“Set-Content”方法并将其解析为常规文本文件,它将保留 ORIGINAL 编码类型。

标签: regex powershell


【解决方案1】:

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 without BOM”格式保存 XML,您可以调用 Save() 方法并使用 StreamWriter 执行 The Right Thing™:

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

【讨论】:

    【解决方案2】:

    正则表达式中的 .* 会被许多人认为是“贪婪的”和危险的。如果包含此标签及其数据的行不包含任何其他内容,那么根据我的理解,确实没有任何重大风险。

    $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
    

    【讨论】:

    • 我很抱歉。我应该在我的 OP 中更具体,但是需要替换的文本部分可能会有所不同。我不会知道“替换此文本”的价值。我只会知道“”的前言和“”的前言。编辑 OP 以澄清。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2022-10-06
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多